LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5wcmVzZW50YXRpb247DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5wcmVzZW50YXRpb24uQXJnRWRpdG9yOw0KDQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLmVkaXRvcnMuSURhd25FZGl0b3I7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLmVkaXRvcnMuSURhd25FZGl0b3JTdXBwb3J0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi5lbWYuZWRpdG9ycy5pbXBsLkRhd25FTUZFZGl0b3JTdXBwb3J0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi51aS5EYXduRWRpdG9ySW5wdXQ7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLnVpLkRhd25MYWJlbFByb3ZpZGVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi51aS5EYXduU2VsZWN0aW9uVmlld2VyQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLnV0aWwuY29ubmVjdGlvbi5DRE9Db25uZWN0aW9uVXRpbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmVyZXNvdXJjZS5DRE9SZXNvdXJjZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLnRyYW5zYWN0aW9uLkNET1RyYW5zYWN0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8udmlldy5DRE9WaWV3Ow0KDQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQppbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0Ow0KDQpwdWJsaWMgY2xhc3MgRGF3bkFyZ0VkaXRvciBleHRlbmRzIEFyZ0VkaXRvciBpbXBsZW1lbnRzIElEYXduRWRpdG9yIHsNCglwcml2YXRlIElEYXduRWRpdG9yU3VwcG9ydCBkYXduRWRpdG9yU3VwcG9ydDsNCg0KCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcucHJlc2VudGF0aW9uLkRhd25BcmdFZGl0b3JJRCI7DQoNCglwdWJsaWMgRGF3bkFyZ0VkaXRvcigpIHsNCgkJc3VwZXIoKTsNCgkJZGF3bkVkaXRvclN1cHBvcnQgPSBuZXcgRGF3bkVNRkVkaXRvclN1cHBvcnQodGhpcyk7DQoJfQ0KDQoJQE92ZXJyaWRlDQoJcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7DQoJCXN1cGVyLnNldElucHV0KGlucHV0KTsNCgkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGF3bkVkaXRvcklucHV0KSB7DQoJCQlkYXduRWRpdG9yU3VwcG9ydC5zZXRWaWV3KCgoRGF3bkVkaXRvcklucHV0KSBpbnB1dCkuZ2V0VmlldygpKTsNCgkJCWRhd25FZGl0b3JTdXBwb3J0LnJlZ2lzdGVyTGlzdGVuZXJzKCk7DQoJCX0NCgl9DQoNCglAT3ZlcnJpZGUNCglwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dFdpdGhOb3RpZnkoSUVkaXRvcklucHV0IGlucHV0KSB7DQoJCXN1cGVyLnNldElucHV0KGlucHV0KTsNCgkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGF3bkVkaXRvcklucHV0KSB7DQoJCQlDRE9SZXNvdXJjZSByZXNvdXJjZSA9ICgoRGF3bkVkaXRvcklucHV0KSBpbnB1dCkuZ2V0UmVzb3VyY2UoKTsNCgkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKCgoRGF3bkVkaXRvcklucHV0KSBpbnB1dCkuZ2V0VVJJKCkNCgkJCQkJLnRvU3RyaW5nKCkpOw0KDQoJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCByZXNvdXJjZS5jZG9WaWV3KCkgPT0gbnVsbCkgew0KCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOw0KCQkJCUNET1RyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gQ0RPQ29ubmVjdGlvblV0aWwuaW5zdGFuY2UNCgkJCQkJCS5vcGVuQ3VycmVudFRyYW5zYWN0aW9uKHJlc291cmNlU2V0LCB1cmkudG9TdHJpbmcoKSk7DQoNCgkJCQlyZXNvdXJjZSA9IChDRE9SZXNvdXJjZSkgcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsNCg0KCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8IHJlc291cmNlLmNkb1ZpZXcoKSA9PSBudWxsKSB7DQoJCQkJCXJlc291cmNlID0gdHJhbnNhY3Rpb24uZ2V0T3JDcmVhdGVSZXNvdXJjZSh1cmkudG9TdHJpbmcoKSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkoKERhd25FZGl0b3JJbnB1dCkgaW5wdXQpLnNldFJlc291cmNlKHJlc291cmNlKTsNCgkJCWRhd25FZGl0b3JTdXBwb3J0LnNldFZpZXcoKChEYXduRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRWaWV3KCkpOw0KCQkJZGF3bkVkaXRvclN1cHBvcnQucmVnaXN0ZXJMaXN0ZW5lcnMoKTsNCgkJfQ0KCX0NCg0KCUBPdmVycmlkZQ0KCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzKCkgew0KCQlzdXBlci5jcmVhdGVQYWdlcygpOw0KDQoJCWlmICghKGdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBEYXduRWRpdG9ySW5wdXQpKSB7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQlzZWxlY3Rpb25WaWV3ZXINCgkJCQkuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBEYXduU2VsZWN0aW9uVmlld2VyQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoDQoJCQkJCQlhZGFwdGVyRmFjdG9yeSwgKChEYXduRWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCkpDQoJCQkJCQkJCS5nZXRSZXNvdXJjZSgpKSk7DQoJCXNlbGVjdGlvblZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEYXduTGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSwNCgkJCQlkYXduRWRpdG9yU3VwcG9ydC5nZXRWaWV3KCksIHNlbGVjdGlvblZpZXdlcikpOw0KCQlwYXJlbnRWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGF3bkxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksDQoJCQkJZGF3bkVkaXRvclN1cHBvcnQuZ2V0VmlldygpLCBzZWxlY3Rpb25WaWV3ZXIpKTsNCgkJbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEYXduTGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSwNCgkJCQlkYXduRWRpdG9yU3VwcG9ydC5nZXRWaWV3KCksIHNlbGVjdGlvblZpZXdlcikpOw0KCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERhd25MYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LA0KCQkJCWRhd25FZGl0b3JTdXBwb3J0LmdldFZpZXcoKSwgc2VsZWN0aW9uVmlld2VyKSk7DQoJCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERhd25MYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LA0KCQkJCWRhd25FZGl0b3JTdXBwb3J0LmdldFZpZXcoKSwgc2VsZWN0aW9uVmlld2VyKSk7DQoJCXRyZWVWaWV3ZXJXaXRoQ2hlY2suc2V0TGFiZWxQcm92aWRlcihuZXcgRGF3bkxhYmVsUHJvdmlkZXIoDQoJCQkJYWRhcHRlckZhY3RvcnksIGRhd25FZGl0b3JTdXBwb3J0LmdldFZpZXcoKSwgc2VsZWN0aW9uVmlld2VyKSk7DQoNCgkJQ0RPUmVzb3VyY2UgcmVzb3VyY2UgPSAoKERhd25FZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKSkNCgkJCQkuZ2V0UmVzb3VyY2UoKTsNCg0KCQlzZWxlY3Rpb25WaWV3ZXIuc2V0SW5wdXQocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7DQoJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVzb3VyY2UpLCB0cnVlKTsNCg0KCQlwYXJlbnRWaWV3ZXINCgkJCQkuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBSZXZlcnNlQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoDQoJCQkJCQlhZGFwdGVyRmFjdG9yeSkpOw0KCX0NCg0KCUBPdmVycmlkZQ0KCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KCQlDRE9WaWV3IHZpZXcgPSBkYXduRWRpdG9yU3VwcG9ydC5nZXRWaWV3KCk7DQoJCWlmICh2aWV3IGluc3RhbmNlb2YgQ0RPVHJhbnNhY3Rpb24pIHsNCgkJCWlmICh2aWV3Lmhhc0NvbmZsaWN0KCkpIHsNCgkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLA0KCQkJCQkJImNvbmZsaWN0IiwNCgkJCQkJCSJZb3VyIFJlc291cmNlIGlzIGluIGNvbmZsaWN0IGFuZCBjYW5ub3QgYmUgY29tbWl0dGVkIik7DQoJCQl9IGVsc2Ugew0KCQkJCXN1cGVyLmRvU2F2ZShwcm9ncmVzc01vbml0b3IpOw0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJc3VwZXIuZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7DQoJCX0NCgl9DQoNCglwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySUQoKSB7DQoJCXJldHVybiAib3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcucHJvcGVydGllcyI7DQoJfQ0KDQoJcHVibGljIENET1ZpZXcgZ2V0VmlldygpIHsNCgkJcmV0dXJuIGRhd25FZGl0b3JTdXBwb3J0LmdldFZpZXcoKTsNCgl9DQoNCglwdWJsaWMgdm9pZCBzZXREaXJ0eSgpIHsNCgkJZGF3bkVkaXRvclN1cHBvcnQuc2V0RGlydHkodHJ1ZSk7DQoJfQ0KDQoJQE92ZXJyaWRlDQoJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCgkJdHJ5IHsNCgkJCXN1cGVyLmRpc3Bvc2UoKTsNCgkJfSBmaW5hbGx5IHsNCgkJCWRhd25FZGl0b3JTdXBwb3J0LmNsb3NlKCk7DQoJCX0NCgl9DQoNCglwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKSB7DQoJCXJldHVybiAib3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcucHJvcGVydGllcyI7DQoJfQ0KDQoJcHVibGljIElEYXduRWRpdG9yU3VwcG9ydCBnZXREYXduRWRpdG9yU3VwcG9ydCgpIHsNCgkJcmV0dXJuIGRhd25FZGl0b3JTdXBwb3J0Ow0KCX0NCn0NCg==