LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLnRlc3RzOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUudGVzdHMuaW50ZXJuYWwuVXRpbFRlc3RDYXNlOwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKCnB1YmxpYyBjbGFzcyBBbGxUZXN0cyB7CglwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CgkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3Igb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS50ZXN0cyIpOwoJCS8vJEpVbml0LUJFR0lOJAoJCXN1aXRlLmFkZFRlc3RTdWl0ZShFeGlzdGVuY2VUZXN0LmNsYXNzKTsKCQlzdWl0ZS5hZGRUZXN0KG5ldyBPcmRlcmVkVGVzdFN1aXRlKFRvbWNhdFJ1bnRpbWVUZXN0Q2FzZS5jbGFzcykpOwoJCQoJCVN0cmluZyBzID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4zMiIpOyAKCQkvL3MgPSAiRDpcXFRvb2xzXFx0b21jYXRcXGpha2FydGEtdG9tY2F0LTMuMi40IjsKCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKSB7CgkJCVJ1bnRpbWVMb2NhdGlvbi5ydW50aW1lTG9jYXRpb24gPSBzOwoJCQlzdWl0ZS5hZGRUZXN0KG5ldyBPcmRlcmVkVGVzdFN1aXRlKFRvbWNhdDMyUnVudGltZVRlc3RDYXNlLmNsYXNzKSk7CgkJCXN1aXRlLmFkZFRlc3QobmV3IE9yZGVyZWRUZXN0U3VpdGUoVG9tY2F0MzJTZXJ2ZXJUZXN0Q2FzZS5jbGFzcykpOwoJCX0KCQkKCQlzID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MCIpOwoJCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApIHsKCQkJUnVudGltZUxvY2F0aW9uLnJ1bnRpbWVMb2NhdGlvbiA9IHM7CgkJCXN1aXRlLmFkZFRlc3QobmV3IE9yZGVyZWRUZXN0U3VpdGUoVG9tY2F0NDBSdW50aW1lVGVzdENhc2UuY2xhc3MpKTsKCQkJc3VpdGUuYWRkVGVzdChuZXcgT3JkZXJlZFRlc3RTdWl0ZShUb21jYXQ0MFNlcnZlclRlc3RDYXNlLmNsYXNzKSk7CgkJfQoJCQoJCXMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIik7CgkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkgewoJCQlSdW50aW1lTG9jYXRpb24ucnVudGltZUxvY2F0aW9uID0gczsKCQkJc3VpdGUuYWRkVGVzdChuZXcgT3JkZXJlZFRlc3RTdWl0ZShUb21jYXQ0MVJ1bnRpbWVUZXN0Q2FzZS5jbGFzcykpOwoJCQlzdWl0ZS5hZGRUZXN0KG5ldyBPcmRlcmVkVGVzdFN1aXRlKFRvbWNhdDQxU2VydmVyVGVzdENhc2UuY2xhc3MpKTsKCQl9CgkJCgkJcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiKTsKCQkvL3MgPSAiRDpcXFRvb2xzXFx0b21jYXRcXGpha2FydGEtdG9tY2F0LTUuMC4xOSI7CgkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkgewoJCQlSdW50aW1lTG9jYXRpb24ucnVudGltZUxvY2F0aW9uID0gczsKCQkJc3VpdGUuYWRkVGVzdChuZXcgT3JkZXJlZFRlc3RTdWl0ZShUb21jYXQ1MFJ1bnRpbWVUZXN0Q2FzZS5jbGFzcykpOwoJCQlzdWl0ZS5hZGRUZXN0KG5ldyBPcmRlcmVkVGVzdFN1aXRlKFRvbWNhdDUwU2VydmVyVGVzdENhc2UuY2xhc3MpKTsKCQl9CgkJCgkJcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTUiKTsKCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKSB7CgkJCVJ1bnRpbWVMb2NhdGlvbi5ydW50aW1lTG9jYXRpb24gPSBzOwoJCQlzdWl0ZS5hZGRUZXN0KG5ldyBPcmRlcmVkVGVzdFN1aXRlKFRvbWNhdDU1UnVudGltZVRlc3RDYXNlLmNsYXNzKSk7CgkJCXN1aXRlLmFkZFRlc3QobmV3IE9yZGVyZWRUZXN0U3VpdGUoVG9tY2F0NTVTZXJ2ZXJUZXN0Q2FzZS5jbGFzcykpOwoJCX0KCQkKCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVXRpbFRlc3RDYXNlLmNsYXNzKTsKCQkvLyRKVW5pdC1FTkQkCgkJcmV0dXJuIHN1aXRlOwoJfQp9