LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKg0KICovDQpwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cmFuY2Vhc3NldHMuYXNzdXJhbmNlYXNzZXQuaW1wbDsNCg0KaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KDQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJhbmNlYXNzZXRzLmFzc3VyYW5jZWFzc2V0LkFzc3VyYW5jZUFzc2V0RXZhbHVhdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJhbmNlYXNzZXRzLmFzc3VyYW5jZWFzc2V0LkFzc3VyYW5jZUFzc2V0RXZlbnQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VyYW5jZWFzc2V0cy5hc3N1cmFuY2Vhc3NldC5Bc3N1cmFuY2Vhc3NldFBhY2thZ2U7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VyYW5jZWFzc2V0cy5hc3N1cmFuY2Vhc3NldC5FdmVudEtpbmQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuaW5mcmEuZ2VuZXJhbC5nZW5lcmFsLkRlc2NyaWJhYmxlRWxlbWVudDsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5pbmZyYS5nZW5lcmFsLmdlbmVyYWwuR2VuZXJhbFBhY2thZ2U7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuaW5mcmEuZ2VuZXJhbC5nZW5lcmFsLk5hbWVkRWxlbWVudDsNCg0KLyoqDQogKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFzc3VyYW5jZSBBc3NldCBFdmVudDwvYj48L2VtPicuDQogKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCiAqIDxwPg0KICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQogKiA8dWw+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VyYW5jZWFzc2V0cy5hc3N1cmFuY2Vhc3NldC5pbXBsLkFzc3VyYW5jZUFzc2V0RXZlbnRJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VyYW5jZWFzc2V0cy5hc3N1cmFuY2Vhc3NldC5pbXBsLkFzc3VyYW5jZUFzc2V0RXZlbnRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPg0KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cmFuY2Vhc3NldHMuYXNzdXJhbmNlYXNzZXQuaW1wbC5Bc3N1cmFuY2VBc3NldEV2ZW50SW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPg0KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cmFuY2Vhc3NldHMuYXNzdXJhbmNlYXNzZXQuaW1wbC5Bc3N1cmFuY2VBc3NldEV2ZW50SW1wbCNnZXRSZXN1bHRpbmdFdmFsdWF0aW9uIDxlbT5SZXN1bHRpbmcgRXZhbHVhdGlvbjwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VyYW5jZWFzc2V0cy5hc3N1cmFuY2Vhc3NldC5pbXBsLkFzc3VyYW5jZUFzc2V0RXZlbnRJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPg0KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cmFuY2Vhc3NldHMuYXNzdXJhbmNlYXNzZXQuaW1wbC5Bc3N1cmFuY2VBc3NldEV2ZW50SW1wbCNnZXRUaW1lIDxlbT5UaW1lPC9lbT59PC9saT4NCiAqIDwvdWw+DQogKiA8L3A+DQogKg0KICogQGdlbmVyYXRlZA0KICovDQpwdWJsaWMgY2xhc3MgQXNzdXJhbmNlQXNzZXRFdmVudEltcGwgZXh0ZW5kcyBBc3N1cmFuY2VBc3NldEltcGwgaW1wbGVtZW50cyBBc3N1cmFuY2VBc3NldEV2ZW50IHsNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwcm90ZWN0ZWQgQXNzdXJhbmNlQXNzZXRFdmVudEltcGwoKSB7DQoJCXN1cGVyKCk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQE92ZXJyaWRlDQoJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQoJCXJldHVybiBBc3N1cmFuY2Vhc3NldFBhY2thZ2UuTGl0ZXJhbHMuQVNTVVJBTkNFX0FTU0VUX0VWRU5UOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7DQoJCXJldHVybiAoU3RyaW5nKWVHZXQoR2VuZXJhbFBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fSUQsIHRydWUpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgew0KCQllU2V0KEdlbmVyYWxQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX0lELCBuZXdJZCk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KCQlyZXR1cm4gKFN0cmluZyllR2V0KEdlbmVyYWxQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUsIHRydWUpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsNCgkJZVNldChHZW5lcmFsUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FLCBuZXdOYW1lKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgew0KCQlyZXR1cm4gKFN0cmluZyllR2V0KEdlbmVyYWxQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0RFU0NSSVBUSU9OLCB0cnVlKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsNCgkJZVNldChHZW5lcmFsUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19ERVNDUklQVElPTiwgbmV3RGVzY3JpcHRpb24pOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBBc3N1cmFuY2VBc3NldEV2YWx1YXRpb24gZ2V0UmVzdWx0aW5nRXZhbHVhdGlvbigpIHsNCgkJcmV0dXJuIChBc3N1cmFuY2VBc3NldEV2YWx1YXRpb24pZUdldChBc3N1cmFuY2Vhc3NldFBhY2thZ2UuTGl0ZXJhbHMuQVNTVVJBTkNFX0FTU0VUX0VWRU5UX19SRVNVTFRJTkdfRVZBTFVBVElPTiwgdHJ1ZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIHZvaWQgc2V0UmVzdWx0aW5nRXZhbHVhdGlvbihBc3N1cmFuY2VBc3NldEV2YWx1YXRpb24gbmV3UmVzdWx0aW5nRXZhbHVhdGlvbikgew0KCQllU2V0KEFzc3VyYW5jZWFzc2V0UGFja2FnZS5MaXRlcmFscy5BU1NVUkFOQ0VfQVNTRVRfRVZFTlRfX1JFU1VMVElOR19FVkFMVUFUSU9OLCBuZXdSZXN1bHRpbmdFdmFsdWF0aW9uKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgRXZlbnRLaW5kIGdldFR5cGUoKSB7DQoJCXJldHVybiAoRXZlbnRLaW5kKWVHZXQoQXNzdXJhbmNlYXNzZXRQYWNrYWdlLkxpdGVyYWxzLkFTU1VSQU5DRV9BU1NFVF9FVkVOVF9fVFlQRSwgdHJ1ZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIHZvaWQgc2V0VHlwZShFdmVudEtpbmQgbmV3VHlwZSkgew0KCQllU2V0KEFzc3VyYW5jZWFzc2V0UGFja2FnZS5MaXRlcmFscy5BU1NVUkFOQ0VfQVNTRVRfRVZFTlRfX1RZUEUsIG5ld1R5cGUpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBEYXRlIGdldFRpbWUoKSB7DQoJCXJldHVybiAoRGF0ZSllR2V0KEFzc3VyYW5jZWFzc2V0UGFja2FnZS5MaXRlcmFscy5BU1NVUkFOQ0VfQVNTRVRfRVZFTlRfX1RJTUUsIHRydWUpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyB2b2lkIHNldFRpbWUoRGF0ZSBuZXdUaW1lKSB7DQoJCWVTZXQoQXNzdXJhbmNlYXNzZXRQYWNrYWdlLkxpdGVyYWxzLkFTU1VSQU5DRV9BU1NFVF9FVkVOVF9fVElNRSwgbmV3VGltZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQE92ZXJyaWRlDQoJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgew0KCQlpZiAoYmFzZUNsYXNzID09IE5hbWVkRWxlbWVudC5jbGFzcykgew0KCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7DQoJCQkJY2FzZSBBc3N1cmFuY2Vhc3NldFBhY2thZ2UuQVNTVVJBTkNFX0FTU0VUX0VWRU5UX19JRDogcmV0dXJuIEdlbmVyYWxQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX0lEOw0KCQkJCWNhc2UgQXNzdXJhbmNlYXNzZXRQYWNrYWdlLkFTU1VSQU5DRV9BU1NFVF9FVkVOVF9fTkFNRTogcmV0dXJuIEdlbmVyYWxQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU7DQoJCQkJZGVmYXVsdDogcmV0dXJuIC0xOw0KCQkJfQ0KCQl9DQoJCWlmIChiYXNlQ2xhc3MgPT0gRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzKSB7DQoJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsNCgkJCQljYXNlIEFzc3VyYW5jZWFzc2V0UGFja2FnZS5BU1NVUkFOQ0VfQVNTRVRfRVZFTlRfX0RFU0NSSVBUSU9OOiByZXR1cm4gR2VuZXJhbFBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fREVTQ1JJUFRJT047DQoJCQkJZGVmYXVsdDogcmV0dXJuIC0xOw0KCQkJfQ0KCQl9DQoJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAT3ZlcnJpZGUNCglwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7DQoJCWlmIChiYXNlQ2xhc3MgPT0gTmFtZWRFbGVtZW50LmNsYXNzKSB7DQoJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsNCgkJCQljYXNlIEdlbmVyYWxQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX0lEOiByZXR1cm4gQXNzdXJhbmNlYXNzZXRQYWNrYWdlLkFTU1VSQU5DRV9BU1NFVF9FVkVOVF9fSUQ7DQoJCQkJY2FzZSBHZW5lcmFsUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOiByZXR1cm4gQXNzdXJhbmNlYXNzZXRQYWNrYWdlLkFTU1VSQU5DRV9BU1NFVF9FVkVOVF9fTkFNRTsNCgkJCQlkZWZhdWx0OiByZXR1cm4gLTE7DQoJCQl9DQoJCX0NCgkJaWYgKGJhc2VDbGFzcyA9PSBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MpIHsNCgkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgew0KCQkJCWNhc2UgR2VuZXJhbFBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fREVTQ1JJUFRJT046IHJldHVybiBBc3N1cmFuY2Vhc3NldFBhY2thZ2UuQVNTVVJBTkNFX0FTU0VUX0VWRU5UX19ERVNDUklQVElPTjsNCgkJCQlkZWZhdWx0OiByZXR1cm4gLTE7DQoJCQl9DQoJCX0NCgkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOw0KCX0NCg0KfSAvL0Fzc3VyYW5jZUFzc2V0RXZlbnRJbXBsDQo=