LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDE2IEZ1bmRhY2nzbiBUZWNuYWxpYSBSZXNlYXJjaCAmIElubm92YXRpb24uCiAqCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICBIdWFzY2FyIEVzcGlub3phIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgQWxlamFuZHJhIFJ17XogLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgTWFyaSBDYXJtZW4gUGFsYWNpb3MgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBBbmdlbCBM83BleiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiAqIEdlbmVyYXRlZCB3aXRoIEFjY2VsZW8KICovCnBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQucGttLnJlZmZyYW1ld29yay5yZWZmcmFtZXdvcmsuY29tcG9uZW50czsKCi8vIFN0YXJ0IG9mIHVzZXIgY29kZSBmb3IgaW1wb3J0cwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmFwaS5ub3RpZnkuRVN0cnVjdHVyYWxGZWF0dXJlTm90aWZpY2F0aW9uRmlsdGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmFwaS5ub3RpZnkuSVByb3BlcnRpZXNFZGl0aW9uRXZlbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuYXBpLm5vdGlmeS5Ob3RpZmljYXRpb25GaWx0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuY29udGV4dC5Qcm9wZXJ0aWVzRWRpdGluZ0NvbnRleHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuY29udGV4dC5pbXBsLkVPYmplY3RQcm9wZXJ0aWVzRWRpdGlvbkNvbnRleHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuaW1wbC5jb21wb25lbnRzLlNpbmdsZVBhcnRQcm9wZXJ0aWVzRWRpdGluZ0NvbXBvbmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5pbXBsLm5vdGlmeS5Qcm9wZXJ0aWVzRWRpdGlvbkV2ZW50OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmltcGwudXRpbHMuRUVGQ29udmVydGVyVXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5pbXBsLnV0aWxzLkVFRlV0aWxzOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLnBvbGljaWVzLlByb3BlcnRpZXNFZGl0aW5nUG9saWN5OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLnByb3ZpZGVycy5Qcm9wZXJ0aWVzRWRpdGluZ1Byb3ZpZGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLnVpLndpZGdldHMuQnV0dG9uc01vZGVFbnVtOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLnVpLndpZGdldHMuZW9iamZsYXRjb21iby5FT2JqZWN0RmxhdENvbWJvU2V0dGluZ3M7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuaW5mcmEuZ2VuZXJhbC5nZW5lcmFsLlJlcXVpcmVtZW50UmVsS2luZDsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnBrbS5yZWZmcmFtZXdvcmsucmVmZnJhbWV3b3JrLlJlZlJlcXVpcmVtZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGttLnJlZmZyYW1ld29yay5yZWZmcmFtZXdvcmsuUmVmUmVxdWlyZW1lbnRSZWw7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5wa20ucmVmZnJhbWV3b3JrLnJlZmZyYW1ld29yay5SZWZmcmFtZXdvcmtGYWN0b3J5OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGttLnJlZmZyYW1ld29yay5yZWZmcmFtZXdvcmsuUmVmZnJhbWV3b3JrUGFja2FnZTsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnBrbS5yZWZmcmFtZXdvcmsucmVmZnJhbWV3b3JrLnBhcnRzLlJlZlJlcXVpcmVtZW50UmVsUHJvcGVydGllc0VkaXRpb25QYXJ0OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGttLnJlZmZyYW1ld29yay5yZWZmcmFtZXdvcmsucGFydHMuUmVmZnJhbWV3b3JrVmlld3NSZXBvc2l0b3J5OwoKCi8vIEVuZCBvZiB1c2VyIGNvZGUKCi8qKgogKiAKICogCiAqLwpwdWJsaWMgY2xhc3MgUmVmUmVxdWlyZW1lbnRSZWxQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudCBleHRlbmRzIFNpbmdsZVBhcnRQcm9wZXJ0aWVzRWRpdGluZ0NvbXBvbmVudCB7CgoJCglwdWJsaWMgc3RhdGljIFN0cmluZyBCQVNFX1BBUlQgPSAiQmFzZSI7IC8vJE5PTi1OTFMtMSQKCgkKCS8qKgoJICogU2V0dGluZ3MgZm9yIHRhcmdldCBFT2JqZWN0RmxhdENvbWJvVmlld2VyCgkgKi8KCXByaXZhdGUgRU9iamVjdEZsYXRDb21ib1NldHRpbmdzIHRhcmdldFNldHRpbmdzOwoJCgkvKioKCSAqIFNldHRpbmdzIGZvciBzb3VyY2UgRU9iamVjdEZsYXRDb21ib1ZpZXdlcgoJICovCglwcml2YXRlIEVPYmplY3RGbGF0Q29tYm9TZXR0aW5ncyBzb3VyY2VTZXR0aW5nczsKCQoJCgkvKioKCSAqIERlZmF1bHQgY29uc3RydWN0b3IKCSAqIAoJICovCglwdWJsaWMgUmVmUmVxdWlyZW1lbnRSZWxQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudChQcm9wZXJ0aWVzRWRpdGluZ0NvbnRleHQgZWRpdGluZ0NvbnRleHQsIEVPYmplY3QgcmVmUmVxdWlyZW1lbnRSZWwsIFN0cmluZyBlZGl0aW5nX21vZGUpIHsKCQlzdXBlcihlZGl0aW5nQ29udGV4dCwgcmVmUmVxdWlyZW1lbnRSZWwsIGVkaXRpbmdfbW9kZSk7CgkJcGFydHMgPSBuZXcgU3RyaW5nW10geyBCQVNFX1BBUlQgfTsKCQlyZXBvc2l0b3J5S2V5ID0gUmVmZnJhbWV3b3JrVmlld3NSZXBvc2l0b3J5LmNsYXNzOwoJCXBhcnRLZXkgPSBSZWZmcmFtZXdvcmtWaWV3c1JlcG9zaXRvcnkuUmVmUmVxdWlyZW1lbnRSZWwuY2xhc3M7Cgl9CgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKiAKCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmFwaS5jb21wb25lbnQuSVByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50I2luaXRQYXJ0KGphdmEubGFuZy5PYmplY3QsIGludCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIAoJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCgkgKiAKCSAqLwoJcHVibGljIHZvaWQgaW5pdFBhcnQoT2JqZWN0IGtleSwgaW50IGtpbmQsIEVPYmplY3QgZWx0LCBSZXNvdXJjZVNldCBhbGxSZXNvdXJjZSkgewoJCXNldEluaXRpYWxpemluZyh0cnVlKTsKCQlpZiAoZWRpdGluZ1BhcnQgIT0gbnVsbCAmJiBrZXkgPT0gcGFydEtleSkgewoJCQllZGl0aW5nUGFydC5zZXRDb250ZXh0KGVsdCwgYWxsUmVzb3VyY2UpOwoJCQkKCQkJZmluYWwgUmVmUmVxdWlyZW1lbnRSZWwgcmVmUmVxdWlyZW1lbnRSZWwgPSAoUmVmUmVxdWlyZW1lbnRSZWwpZWx0OwoJCQlmaW5hbCBSZWZSZXF1aXJlbWVudFJlbFByb3BlcnRpZXNFZGl0aW9uUGFydCBiYXNlUGFydCA9IChSZWZSZXF1aXJlbWVudFJlbFByb3BlcnRpZXNFZGl0aW9uUGFydCllZGl0aW5nUGFydDsKCQkJLy8gaW5pdCB2YWx1ZXMKCQkJaWYgKGlzQWNjZXNzaWJsZShSZWZmcmFtZXdvcmtWaWV3c1JlcG9zaXRvcnkuUmVmUmVxdWlyZW1lbnRSZWwuUHJvcGVydGllcy50YXJnZXQpKSB7CgkJCQkvLyBpbml0IHBhcnQKCQkJCXRhcmdldFNldHRpbmdzID0gbmV3IEVPYmplY3RGbGF0Q29tYm9TZXR0aW5ncyhyZWZSZXF1aXJlbWVudFJlbCwgUmVmZnJhbWV3b3JrUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVmUmVxdWlyZW1lbnRSZWxfVGFyZ2V0KCkpOwoJCQkJYmFzZVBhcnQuaW5pdFRhcmdldCh0YXJnZXRTZXR0aW5ncyk7CgkJCQkvLyBzZXQgdGhlIGJ1dHRvbiBtb2RlCgkJCQliYXNlUGFydC5zZXRUYXJnZXRCdXR0b25Nb2RlKEJ1dHRvbnNNb2RlRW51bS5CUk9XU0UpOwoJCQl9CgkJCWlmIChpc0FjY2Vzc2libGUoUmVmZnJhbWV3b3JrVmlld3NSZXBvc2l0b3J5LlJlZlJlcXVpcmVtZW50UmVsLlByb3BlcnRpZXMuc291cmNlKSkgewoJCQkJLy8gaW5pdCBwYXJ0CgkJCQlzb3VyY2VTZXR0aW5ncyA9IG5ldyBFT2JqZWN0RmxhdENvbWJvU2V0dGluZ3MocmVmUmVxdWlyZW1lbnRSZWwsIFJlZmZyYW1ld29ya1BhY2thZ2UuZUlOU1RBTkNFLmdldFJlZlJlcXVpcmVtZW50UmVsX1NvdXJjZSgpKTsKCQkJCWJhc2VQYXJ0LmluaXRTb3VyY2Uoc291cmNlU2V0dGluZ3MpOwoJCQkJLy8gc2V0IHRoZSBidXR0b24gbW9kZQoJCQkJYmFzZVBhcnQuc2V0U291cmNlQnV0dG9uTW9kZShCdXR0b25zTW9kZUVudW0uQlJPV1NFKTsKCQkJfQoJCQlpZiAoaXNBY2Nlc3NpYmxlKFJlZmZyYW1ld29ya1ZpZXdzUmVwb3NpdG9yeS5SZWZSZXF1aXJlbWVudFJlbC5Qcm9wZXJ0aWVzLnR5cGUpKSB7CgkJCQliYXNlUGFydC5pbml0VHlwZShFRUZVdGlscy5jaG9pY2VPZlZhbHVlcyhyZWZSZXF1aXJlbWVudFJlbCwgUmVmZnJhbWV3b3JrUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVmUmVxdWlyZW1lbnRSZWxfVHlwZSgpKSwgcmVmUmVxdWlyZW1lbnRSZWwuZ2V0VHlwZSgpKTsKCQkJfQoJCQkvLyBpbml0IGZpbHRlcnMKCQkJaWYgKGlzQWNjZXNzaWJsZShSZWZmcmFtZXdvcmtWaWV3c1JlcG9zaXRvcnkuUmVmUmVxdWlyZW1lbnRSZWwuUHJvcGVydGllcy50YXJnZXQpKSB7CgkJCQliYXNlUGFydC5hZGRGaWx0ZXJUb1RhcmdldChuZXcgVmlld2VyRmlsdGVyKCkgewoJCQkJCgkJCQkJLyoqCgkJCQkJICoge0Bpbmhlcml0RG9jfQoJCQkJCSAqIAoJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXIjc2VsZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQoJCQkJCSAqLwoJCQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKCQkJCQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgUmVmUmVxdWlyZW1lbnQpOwoJCQkJCX0KCQkJCQkKCQkJCX0pOwoJCQkJLy8gU3RhcnQgb2YgdXNlciBjb2RlIGZvciBhZGRpdGlvbmFsIGJ1c2luZXNzZmlsdGVycyBmb3IgdGFyZ2V0CgkJCQkvLyBFbmQgb2YgdXNlciBjb2RlCgkJCX0KCQkJaWYgKGlzQWNjZXNzaWJsZShSZWZmcmFtZXdvcmtWaWV3c1JlcG9zaXRvcnkuUmVmUmVxdWlyZW1lbnRSZWwuUHJvcGVydGllcy5zb3VyY2UpKSB7CgkJCQliYXNlUGFydC5hZGRGaWx0ZXJUb1NvdXJjZShuZXcgVmlld2VyRmlsdGVyKCkgewoJCQkJCgkJCQkJLyoqCgkJCQkJICoge0Bpbmhlcml0RG9jfQoJCQkJCSAqIAoJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXIjc2VsZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQoJCQkJCSAqLwoJCQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKCQkJCQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgUmVmUmVxdWlyZW1lbnQpOwoJCQkJCX0KCQkJCQkKCQkJCX0pOwoJCQkJLy8gU3RhcnQgb2YgdXNlciBjb2RlIGZvciBhZGRpdGlvbmFsIGJ1c2luZXNzZmlsdGVycyBmb3Igc291cmNlCgkJCQkvLyBFbmQgb2YgdXNlciBjb2RlCgkJCX0KCQkJCgkJCS8vIGluaXQgdmFsdWVzIGZvciByZWZlcmVuY2VkIHZpZXdzCgkJCQoJCQkvLyBpbml0IGZpbHRlcnMgZm9yIHJlZmVyZW5jZWQgdmlld3MKCQkJCgkJfQoJCXNldEluaXRpYWxpemluZyhmYWxzZSk7Cgl9CgoKCgoKCgkvKioKCSAqIHtAaW5oZXJpdERvY30KCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmltcGwuY29tcG9uZW50cy5TdGFuZGFyZFByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50I2Fzc29jaWF0ZWRGZWF0dXJlKGphdmEubGFuZy5PYmplY3QpCgkgKi8KCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgYXNzb2NpYXRlZEZlYXR1cmUoT2JqZWN0IGVkaXRvcktleSkgewoJCWlmIChlZGl0b3JLZXkgPT0gUmVmZnJhbWV3b3JrVmlld3NSZXBvc2l0b3J5LlJlZlJlcXVpcmVtZW50UmVsLlByb3BlcnRpZXMudGFyZ2V0KSB7CgkJCXJldHVybiBSZWZmcmFtZXdvcmtQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZWZSZXF1aXJlbWVudFJlbF9UYXJnZXQoKTsKCQl9CgkJaWYgKGVkaXRvcktleSA9PSBSZWZmcmFtZXdvcmtWaWV3c1JlcG9zaXRvcnkuUmVmUmVxdWlyZW1lbnRSZWwuUHJvcGVydGllcy5zb3VyY2UpIHsKCQkJcmV0dXJuIFJlZmZyYW1ld29ya1BhY2thZ2UuZUlOU1RBTkNFLmdldFJlZlJlcXVpcmVtZW50UmVsX1NvdXJjZSgpOwoJCX0KCQlpZiAoZWRpdG9yS2V5ID09IFJlZmZyYW1ld29ya1ZpZXdzUmVwb3NpdG9yeS5SZWZSZXF1aXJlbWVudFJlbC5Qcm9wZXJ0aWVzLnR5cGUpIHsKCQkJcmV0dXJuIFJlZmZyYW1ld29ya1BhY2thZ2UuZUlOU1RBTkNFLmdldFJlZlJlcXVpcmVtZW50UmVsX1R5cGUoKTsKCQl9CgkJcmV0dXJuIHN1cGVyLmFzc29jaWF0ZWRGZWF0dXJlKGVkaXRvcktleSk7Cgl9CgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5pbXBsLmNvbXBvbmVudHMuU3RhbmRhcmRQcm9wZXJ0aWVzRWRpdGlvbkNvbXBvbmVudCN1cGRhdGVTZW1hbnRpY01vZGVsKG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS5hcGkubm90aWZ5LklQcm9wZXJ0aWVzRWRpdGlvbkV2ZW50KQoJICogCgkgKi8KCXB1YmxpYyB2b2lkIHVwZGF0ZVNlbWFudGljTW9kZWwoZmluYWwgSVByb3BlcnRpZXNFZGl0aW9uRXZlbnQgZXZlbnQpIHsKCQlSZWZSZXF1aXJlbWVudFJlbCByZWZSZXF1aXJlbWVudFJlbCA9IChSZWZSZXF1aXJlbWVudFJlbClzZW1hbnRpY09iamVjdDsKCQlpZiAoUmVmZnJhbWV3b3JrVmlld3NSZXBvc2l0b3J5LlJlZlJlcXVpcmVtZW50UmVsLlByb3BlcnRpZXMudGFyZ2V0ID09IGV2ZW50LmdldEFmZmVjdGVkRWRpdG9yKCkpIHsKCQkJaWYgKGV2ZW50LmdldEtpbmQoKSA9PSBQcm9wZXJ0aWVzRWRpdGlvbkV2ZW50LlNFVCkgewoJCQkJdGFyZ2V0U2V0dGluZ3Muc2V0VG9SZWZlcmVuY2UoKFJlZlJlcXVpcmVtZW50KWV2ZW50LmdldE5ld1ZhbHVlKCkpOwoJCQl9IGVsc2UgaWYgKGV2ZW50LmdldEtpbmQoKSA9PSBQcm9wZXJ0aWVzRWRpdGlvbkV2ZW50LkFERCkgewoJCQkJUmVmUmVxdWlyZW1lbnQgZU9iamVjdCA9IFJlZmZyYW1ld29ya0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlZlJlcXVpcmVtZW50KCk7CgkJCQlFT2JqZWN0UHJvcGVydGllc0VkaXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgRU9iamVjdFByb3BlcnRpZXNFZGl0aW9uQ29udGV4dChlZGl0aW5nQ29udGV4dCwgdGhpcywgZU9iamVjdCwgZWRpdGluZ0NvbnRleHQuZ2V0QWRhcHRlckZhY3RvcnkoKSk7CgkJCQlQcm9wZXJ0aWVzRWRpdGluZ1Byb3ZpZGVyIHByb3ZpZGVyID0gKFByb3BlcnRpZXNFZGl0aW5nUHJvdmlkZXIpZWRpdGluZ0NvbnRleHQuZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChlT2JqZWN0LCBQcm9wZXJ0aWVzRWRpdGluZ1Byb3ZpZGVyLmNsYXNzKTsKCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7CgkJCQkJUHJvcGVydGllc0VkaXRpbmdQb2xpY3kgcG9saWN5ID0gcHJvdmlkZXIuZ2V0UG9saWN5KGNvbnRleHQpOwoJCQkJCWlmIChwb2xpY3kgIT0gbnVsbCkgewoJCQkJCQlwb2xpY3kuZXhlY3V0ZSgpOwoJCQkJCX0KCQkJCX0KCQkJCXRhcmdldFNldHRpbmdzLnNldFRvUmVmZXJlbmNlKGVPYmplY3QpOwoJCQl9CgkJfQoJCWlmIChSZWZmcmFtZXdvcmtWaWV3c1JlcG9zaXRvcnkuUmVmUmVxdWlyZW1lbnRSZWwuUHJvcGVydGllcy5zb3VyY2UgPT0gZXZlbnQuZ2V0QWZmZWN0ZWRFZGl0b3IoKSkgewoJCQlpZiAoZXZlbnQuZ2V0S2luZCgpID09IFByb3BlcnRpZXNFZGl0aW9uRXZlbnQuU0VUKSB7CgkJCQlzb3VyY2VTZXR0aW5ncy5zZXRUb1JlZmVyZW5jZSgoUmVmUmVxdWlyZW1lbnQpZXZlbnQuZ2V0TmV3VmFsdWUoKSk7CgkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0S2luZCgpID09IFByb3BlcnRpZXNFZGl0aW9uRXZlbnQuQUREKSB7CgkJCQlSZWZSZXF1aXJlbWVudCBlT2JqZWN0ID0gUmVmZnJhbWV3b3JrRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVmUmVxdWlyZW1lbnQoKTsKCQkJCUVPYmplY3RQcm9wZXJ0aWVzRWRpdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBFT2JqZWN0UHJvcGVydGllc0VkaXRpb25Db250ZXh0KGVkaXRpbmdDb250ZXh0LCB0aGlzLCBlT2JqZWN0LCBlZGl0aW5nQ29udGV4dC5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKCQkJCVByb3BlcnRpZXNFZGl0aW5nUHJvdmlkZXIgcHJvdmlkZXIgPSAoUHJvcGVydGllc0VkaXRpbmdQcm92aWRlcillZGl0aW5nQ29udGV4dC5nZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGVPYmplY3QsIFByb3BlcnRpZXNFZGl0aW5nUHJvdmlkZXIuY2xhc3MpOwoJCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKCQkJCQlQcm9wZXJ0aWVzRWRpdGluZ1BvbGljeSBwb2xpY3kgPSBwcm92aWRlci5nZXRQb2xpY3koY29udGV4dCk7CgkJCQkJaWYgKHBvbGljeSAhPSBudWxsKSB7CgkJCQkJCXBvbGljeS5leGVjdXRlKCk7CgkJCQkJfQoJCQkJfQoJCQkJc291cmNlU2V0dGluZ3Muc2V0VG9SZWZlcmVuY2UoZU9iamVjdCk7CgkJCX0KCQl9CgkJaWYgKFJlZmZyYW1ld29ya1ZpZXdzUmVwb3NpdG9yeS5SZWZSZXF1aXJlbWVudFJlbC5Qcm9wZXJ0aWVzLnR5cGUgPT0gZXZlbnQuZ2V0QWZmZWN0ZWRFZGl0b3IoKSkgewoJCQlyZWZSZXF1aXJlbWVudFJlbC5zZXRUeXBlKChSZXF1aXJlbWVudFJlbEtpbmQpZXZlbnQuZ2V0TmV3VmFsdWUoKSk7CgkJfQoJfQoKCS8qKgoJICoge0Bpbmhlcml0RG9jfQoJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuaW1wbC5jb21wb25lbnRzLlN0YW5kYXJkUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQjdXBkYXRlUGFydChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCgkgKi8KCXB1YmxpYyB2b2lkIHVwZGF0ZVBhcnQoTm90aWZpY2F0aW9uIG1zZykgewoJCXN1cGVyLnVwZGF0ZVBhcnQobXNnKTsKCQlpZiAoZWRpdGluZ1BhcnQuaXNWaXNpYmxlKCkpIHsKCQkJUmVmUmVxdWlyZW1lbnRSZWxQcm9wZXJ0aWVzRWRpdGlvblBhcnQgYmFzZVBhcnQgPSAoUmVmUmVxdWlyZW1lbnRSZWxQcm9wZXJ0aWVzRWRpdGlvblBhcnQpZWRpdGluZ1BhcnQ7CgkJCWlmIChSZWZmcmFtZXdvcmtQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZWZSZXF1aXJlbWVudFJlbF9UYXJnZXQoKS5lcXVhbHMobXNnLmdldEZlYXR1cmUoKSkgJiYgYmFzZVBhcnQgIT0gbnVsbCAmJiBpc0FjY2Vzc2libGUoUmVmZnJhbWV3b3JrVmlld3NSZXBvc2l0b3J5LlJlZlJlcXVpcmVtZW50UmVsLlByb3BlcnRpZXMudGFyZ2V0KSkKCQkJCWJhc2VQYXJ0LnNldFRhcmdldCgoRU9iamVjdCltc2cuZ2V0TmV3VmFsdWUoKSk7CgkJCWlmIChSZWZmcmFtZXdvcmtQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZWZSZXF1aXJlbWVudFJlbF9Tb3VyY2UoKS5lcXVhbHMobXNnLmdldEZlYXR1cmUoKSkgJiYgYmFzZVBhcnQgIT0gbnVsbCAmJiBpc0FjY2Vzc2libGUoUmVmZnJhbWV3b3JrVmlld3NSZXBvc2l0b3J5LlJlZlJlcXVpcmVtZW50UmVsLlByb3BlcnRpZXMuc291cmNlKSkKCQkJCWJhc2VQYXJ0LnNldFNvdXJjZSgoRU9iamVjdCltc2cuZ2V0TmV3VmFsdWUoKSk7CgkJCWlmIChSZWZmcmFtZXdvcmtQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZWZSZXF1aXJlbWVudFJlbF9UeXBlKCkuZXF1YWxzKG1zZy5nZXRGZWF0dXJlKCkpICYmIG1zZy5nZXROb3RpZmllcigpLmVxdWFscyhzZW1hbnRpY09iamVjdCkgJiYgaXNBY2Nlc3NpYmxlKFJlZmZyYW1ld29ya1ZpZXdzUmVwb3NpdG9yeS5SZWZSZXF1aXJlbWVudFJlbC5Qcm9wZXJ0aWVzLnR5cGUpKQoJCQkJYmFzZVBhcnQuc2V0VHlwZSgoUmVxdWlyZW1lbnRSZWxLaW5kKW1zZy5nZXROZXdWYWx1ZSgpKTsKCQkJCgkJCQoJCX0KCX0KCgkvKioKCSAqIHtAaW5oZXJpdERvY30KCSAqIAoJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuaW1wbC5jb21wb25lbnRzLlN0YW5kYXJkUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQjZ2V0Tm90aWZpY2F0aW9uRmlsdGVycygpCgkgKi8KCUBPdmVycmlkZQoJcHJvdGVjdGVkIE5vdGlmaWNhdGlvbkZpbHRlcltdIGdldE5vdGlmaWNhdGlvbkZpbHRlcnMoKSB7CgkJTm90aWZpY2F0aW9uRmlsdGVyIGZpbHRlciA9IG5ldyBFU3RydWN0dXJhbEZlYXR1cmVOb3RpZmljYXRpb25GaWx0ZXIoCgkJCVJlZmZyYW1ld29ya1BhY2thZ2UuZUlOU1RBTkNFLmdldFJlZlJlcXVpcmVtZW50UmVsX1RhcmdldCgpLAoJCQlSZWZmcmFtZXdvcmtQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZWZSZXF1aXJlbWVudFJlbF9Tb3VyY2UoKSwKCQkJUmVmZnJhbWV3b3JrUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVmUmVxdWlyZW1lbnRSZWxfVHlwZSgpCQkpOwoJCXJldHVybiBuZXcgTm90aWZpY2F0aW9uRmlsdGVyW10ge2ZpbHRlcix9OwoJfQoKCgkvKioKCSAqIHtAaW5oZXJpdERvY30KCSAqIAoJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWVmLnJ1bnRpbWUuaW1wbC5jb21wb25lbnRzLlN0YW5kYXJkUHJvcGVydGllc0VkaXRpb25Db21wb25lbnQjaXNSZXF1aXJlZChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCgkgKiAKCSAqLwoJcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZChPYmplY3Qga2V5LCBpbnQga2luZCkgewoJCXJldHVybiBrZXkgPT0gUmVmZnJhbWV3b3JrVmlld3NSZXBvc2l0b3J5LlJlZlJlcXVpcmVtZW50UmVsLlByb3BlcnRpZXMudGFyZ2V0IHx8IGtleSA9PSBSZWZmcmFtZXdvcmtWaWV3c1JlcG9zaXRvcnkuUmVmUmVxdWlyZW1lbnRSZWwuUHJvcGVydGllcy5zb3VyY2U7Cgl9CgoJLyoqCgkgKiB7QGluaGVyaXREb2N9CgkgKiAKCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmFwaS5jb21wb25lbnQuSVByb3BlcnRpZXNFZGl0aW9uQ29tcG9uZW50I3ZhbGlkYXRlVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVlZi5ydW50aW1lLmFwaS5ub3RpZnkuSVByb3BlcnRpZXNFZGl0aW9uRXZlbnQpCgkgKiAKCSAqLwoJcHVibGljIERpYWdub3N0aWMgdmFsaWRhdGVWYWx1ZShJUHJvcGVydGllc0VkaXRpb25FdmVudCBldmVudCkgewoJCURpYWdub3N0aWMgcmV0ID0gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsKCQlpZiAoZXZlbnQuZ2V0TmV3VmFsdWUoKSAhPSBudWxsKSB7CgkJCXRyeSB7CgkJCQlpZiAoUmVmZnJhbWV3b3JrVmlld3NSZXBvc2l0b3J5LlJlZlJlcXVpcmVtZW50UmVsLlByb3BlcnRpZXMudHlwZSA9PSBldmVudC5nZXRBZmZlY3RlZEVkaXRvcigpKSB7CgkJCQkJT2JqZWN0IG5ld1ZhbHVlID0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKCQkJCQlpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKCQkJCQkJbmV3VmFsdWUgPSBFRUZDb252ZXJ0ZXJVdGlsLmNyZWF0ZUZyb21TdHJpbmcoUmVmZnJhbWV3b3JrUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVmUmVxdWlyZW1lbnRSZWxfVHlwZSgpLmdldEVBdHRyaWJ1dGVUeXBlKCksIChTdHJpbmcpbmV3VmFsdWUpOwoJCQkJCX0KCQkJCQlyZXQgPSBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKFJlZmZyYW1ld29ya1BhY2thZ2UuZUlOU1RBTkNFLmdldFJlZlJlcXVpcmVtZW50UmVsX1R5cGUoKS5nZXRFQXR0cmlidXRlVHlwZSgpLCBuZXdWYWx1ZSk7CgkJCQl9CgkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKCQkJCXJldCA9IEJhc2ljRGlhZ25vc3RpYy50b0RpYWdub3N0aWMoaWFlKTsKCQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiB3ZSkgewoJCQkJcmV0ID0gQmFzaWNEaWFnbm9zdGljLnRvRGlhZ25vc3RpYyh3ZSk7CgkJCX0KCQl9CgkJcmV0dXJuIHJldDsKCX0KCgoJCgp9Cg==