LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBOYWNpIE0uIERhaSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudGVzdHM7CgppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLlNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5jb3JlLnV0aWwuRXh0ZW5zaW9uUG9pbnRVdGlsOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwoKLyoqCiAqIEBhdXRob3IgbmFjaQogKiAKICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAqLwpwdWJsaWMgY2xhc3MgU2VydmVyRGVmaW5pdGlvblR5cGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewoKCS8qCgkgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKCSAqLwoJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlzdXBlci5zZXRVcCgpOwoJfQoKCS8qCgkgKiBAc2VlIFRlc3RDYXNlI3RlYXJEb3duKCkKCSAqLwoJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlzdXBlci50ZWFyRG93bigpOwoJfQoKCS8qKgoJICogQ29uc3RydWN0b3IgZm9yIFBsdWdpbkludGVncml0eVRlc3QuCgkgKiAKCSAqIEBwYXJhbSBuYW1lCgkgKi8KCXB1YmxpYyBTZXJ2ZXJEZWZpbml0aW9uVHlwZVRlc3QoU3RyaW5nIG5hbWUpIHsKCQlzdXBlcihuYW1lKTsKCX0KCglwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZXMoKSB7CiAgICAgICAgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBFeHRlbnNpb25Qb2ludFV0aWwuZ2V0R2VuZXJpY1NlcnZlckRlZmluaXRpb25FeHRlbnNpb25zKCk7CiAgICAgICAgaW50IG5vT2ZFeHRlbnNpb25zID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICBub09mRXh0ZW5zaW9ucys9ICBFeHRlbnNpb25Qb2ludFV0aWwuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKGV4dGVuc2lvbnNbaV0pLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyIHNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlciA9IENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcigpOwoJCWFzc2VydE5vdE51bGwoc2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyKTsKCQlTZXJ2ZXJSdW50aW1lW10gdHlwZXMgPSBzZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIuZ2V0U2VydmVyVHlwZURlZmluaXRpb25zKCk7CgkJYXNzZXJ0Tm90TnVsbCh0eXBlcyk7CgkJYXNzZXJ0RXF1YWxzKG5vT2ZFeHRlbnNpb25zLCB0eXBlcy5sZW5ndGgpOwoJfQoKCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlKCkgewoJCVNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlciBzZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIgPSBDb3JlUGx1Z2luCgkJCQkuZ2V0RGVmYXVsdCgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcigpOwoJCWFzc2VydE5vdE51bGwoc2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyKTsKCQlTZXJ2ZXJSdW50aW1lW10gdHlwZXMgPSBzZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIKCQkJCS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbnMoKTsKCQlhc3NlcnROb3ROdWxsKHR5cGVzKTsKCQlhc3NlcnRUcnVlKHR5cGVzLmxlbmd0aCA+IDApOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKCQkJU2VydmVyUnVudGltZSBkZWZpbml0aW9uID0gdHlwZXNbaV07CgkJCVN0cmluZyB3ZCA9IGRlZmluaXRpb24uZ2V0U3RhcnQoKS5nZXRXb3JraW5nRGlyZWN0b3J5KCk7CgkJCVN0cmluZyByZXNvbHZlZCA9IGRlZmluaXRpb24uZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyh3ZCk7CgkJCWFzc2VydEZhbHNlKHJlc29sdmVkLmluZGV4T2YoIiR7IikgPj0gMCk7CgkJfQoJfQovLyAgICBwdWJsaWMgdm9pZCB0ZXN0RWNsaXBzZVZhclJlc29sdmUoKSB7Ci8vICAgICAgICBTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIgc2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyID0gQ29yZVBsdWdpbgovLyAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdCgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcigpOwovLyAgICAgICAgYXNzZXJ0Tm90TnVsbCggc2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyICk7Ci8vICAgICAgICBTZXJ2ZXJSdW50aW1lW10gdHlwZXMgPSBzZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIKLy8gICAgICAgICAgICAgICAgLmdldFNlcnZlclR5cGVEZWZpbml0aW9ucygpOwovLyAgICAgICAgYXNzZXJ0Tm90TnVsbCggdHlwZXMgKTsKLy8gICAgICAgIGFzc2VydFRydWUoIHR5cGVzLmxlbmd0aCA+IDAgKTsKLy8gICAgICAgIFNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiA9IHR5cGVzWzBdOwovLyAgICAgICAgU3RyaW5nIHJlc29sdmVkID0gZGVmaW5pdGlvbi5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKCAidGVzdCAke3dvcmtzcGFjZV9sb2N9IHRlc3QgIiApOwovLyAgICAgICAgYXNzZXJ0RmFsc2UocmVzb2x2ZWQuaW5kZXhPZigiJHsiKSA+PSAwKTsKLy8gICAgfQogICAgCn0K