LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDE2IEZ1bmRhY2nzbiBUZWNuYWxpYSBSZXNlYXJjaCAmIElubm92YXRpb24uCiAqCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICBIdWFzY2FyIEVzcGlub3phIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgQWxlamFuZHJhIFJ17XogLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgTWFyaSBDYXJtZW4gUGFsYWNpb3MgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBBbmdlbCBM83BleiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogCiAqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnBrbS5yZWZmcmFtZXdvcmsucmVmZnJhbWV3b3JrLmRpYWdyYW0uZWRpdC5wYXJ0czsKCmltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwppbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuZWRpdGhlbHBlcnMuQ3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0OwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5OwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5OwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uUmVxdWVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld0FuZEVsZW1lbnRSZXF1ZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnRvb2xpbmcucnVudGltZS5lZGl0LnBvbGljaWVzLnJlcGFyZW50LkNyZWF0aW9uRWRpdFBvbGljeVdpdGhDdXN0b21SZXBhcmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnBrbS5yZWZmcmFtZXdvcmsucmVmZnJhbWV3b3JrLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5SZWZBY3Rpdml0eVJlZkFjdGl2aXR5U3ViQWN0aXZpdHlDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGttLnJlZmZyYW1ld29yay5yZWZmcmFtZXdvcmsuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlJlZkFjdGl2aXR5UmVmQWN0aXZpdHlTdWJBY3Rpdml0eUNvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5wa20ucmVmZnJhbWV3b3JrLnJlZmZyYW1ld29yay5kaWFncmFtLnBhcnQuTWVzc2FnZXM7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5wa20ucmVmZnJhbWV3b3JrLnJlZmZyYW1ld29yay5kaWFncmFtLnBhcnQuUmVmZnJhbWV3b3JrVmlzdWFsSURSZWdpc3RyeTsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnBrbS5yZWZmcmFtZXdvcmsucmVmZnJhbWV3b3JrLmRpYWdyYW0ucHJvdmlkZXJzLlJlZmZyYW1ld29ya0VsZW1lbnRUeXBlczsKCi8qKgogKiBAZ2VuZXJhdGVkCiAqLwpwdWJsaWMgY2xhc3MgUmVmQWN0aXZpdHlSZWZBY3Rpdml0eVN1YkFjdGl2aXR5Q29tcGFydG1lbnQyRWRpdFBhcnQgZXh0ZW5kcwoJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7CgoJLyoqCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMDI7CgoJLyoqCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXB1YmxpYyBSZWZBY3Rpdml0eVJlZkFjdGl2aXR5U3ViQWN0aXZpdHlDb21wYXJ0bWVudDJFZGl0UGFydChWaWV3IHZpZXcpIHsKCQlzdXBlcih2aWV3KTsKCX0KCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7CgkJcmV0dXJuIE1lc3NhZ2VzLlJlZkFjdGl2aXR5UmVmQWN0aXZpdHlTdWJBY3Rpdml0eUNvbXBhcnRtZW50MkVkaXRQYXJ0X3RpdGxlOwoJfQoKCS8qKgoJICogQGdlbmVyYXRlZAoJICovCglwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7CgkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcgoJCQkJLmNyZWF0ZUZpZ3VyZSgpOwoJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOwoJCXJldHVybiByZXN1bHQ7Cgl9CgoJLyoqCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7CgkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwoJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCgkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOwoJCWluc3RhbGxFZGl0UG9saWN5KAoJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCgkJCQluZXcgUmVmQWN0aXZpdHlSZWZBY3Rpdml0eVN1YkFjdGl2aXR5Q29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3lXaXRoQ3VzdG9tUmVwYXJlbnQoCgkJCQkJCVJlZmZyYW1ld29ya1Zpc3VhbElEUmVnaXN0cnkuVFlQRURfSU5TVEFOQ0UpKTsKCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsCgkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOwoJCWluc3RhbGxFZGl0UG9saWN5KAoJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAoJCQkJbmV3IFJlZkFjdGl2aXR5UmVmQWN0aXZpdHlTdWJBY3Rpdml0eUNvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Cgl9CgoJLyoqCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgewoJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsKCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOwoJCX0KCX0KCgkvKioKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHVibGljIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KFJlcXVlc3QgcmVxdWVzdCkgewoJCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlVmlld0FuZEVsZW1lbnRSZXF1ZXN0KSB7CgkJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlciBhZGFwdGVyID0gKChDcmVhdGVWaWV3QW5kRWxlbWVudFJlcXVlc3QpIHJlcXVlc3QpCgkJCQkJLmdldFZpZXdBbmRFbGVtZW50RGVzY3JpcHRvcigpCgkJCQkJLmdldENyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlcigpOwoJCQlJRWxlbWVudFR5cGUgdHlwZSA9IChJRWxlbWVudFR5cGUpIGFkYXB0ZXIKCQkJCQkuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwoJCQlpZiAodHlwZSA9PSBSZWZmcmFtZXdvcmtFbGVtZW50VHlwZXMuUmVmQWN0aXZpdHlfMzAwMSkgewoJCQkJcmV0dXJuIHRoaXM7CgkJCX0KCQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwoJCX0KCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0KSB7CgkJCWlmIChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX0VORC5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKSB7CgkJCQlmb3IgKE9iamVjdCB0eXBlIDogKChDcmVhdGVVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uUmVxdWVzdCkgcmVxdWVzdCkKCQkJCQkJLmdldEVsZW1lbnRUeXBlcygpKSB7CgkJCQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBJRWxlbWVudFR5cGUpIHsKCQkJCQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKElFbGVtZW50VHlwZSkgdHlwZTsKCQkJCQkJaWYgKGVsZW1lbnRUeXBlCgkJCQkJCQkJLmVxdWFscyhSZWZmcmFtZXdvcmtFbGVtZW50VHlwZXMuUmVmQWN0aXZpdHlQcmVjZWRpbmdBY3Rpdml0eV80MDAzKSkKCQkJCQkJCXJldHVybiBzdXBlci5nZXRUYXJnZXRFZGl0UGFydChyZXF1ZXN0KTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwoJCX0KCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Cgl9Cgp9Cg==