LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKg0KICovDQpwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnBrbS5yZWZmcmFtZXdvcmsucmVmZnJhbWV3b3JrOw0KDQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5DRE9PYmplY3Q7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuaW5mcmEuZ2VuZXJhbC5nZW5lcmFsLkFwcGxpY2FiaWxpdHlLaW5kOw0KDQovKioNCiAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQogKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWYgQXBwbGljYWJpbGl0eSBSZWw8L2I+PC9lbT4nLg0KICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQogKg0KICogPHA+DQogKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQogKiA8dWw+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGttLnJlZmZyYW1ld29yay5yZWZmcmFtZXdvcmsuUmVmQXBwbGljYWJpbGl0eVJlbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4NCiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5wa20ucmVmZnJhbWV3b3JrLnJlZmZyYW1ld29yay5SZWZBcHBsaWNhYmlsaXR5UmVsI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4NCiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5wa20ucmVmZnJhbWV3b3JrLnJlZmZyYW1ld29yay5SZWZBcHBsaWNhYmlsaXR5UmVsI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59PC9saT4NCiAqIDwvdWw+DQogKiA8L3A+DQogKg0KICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5wa20ucmVmZnJhbWV3b3JrLnJlZmZyYW1ld29yay5SZWZmcmFtZXdvcmtQYWNrYWdlI2dldFJlZkFwcGxpY2FiaWxpdHlSZWwoKQ0KICogQG1vZGVsDQogKiBAZXh0ZW5kcyBDRE9PYmplY3QNCiAqIEBnZW5lcmF0ZWQNCiAqLw0KcHVibGljIGludGVyZmFjZSBSZWZBcHBsaWNhYmlsaXR5UmVsIGV4dGVuZHMgQ0RPT2JqZWN0IHsNCgkvKioNCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQoJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuaW5mcmEuZ2VuZXJhbC5nZW5lcmFsLkFwcGxpY2FiaWxpdHlLaW5kfS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDxwPg0KCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCgkgKiA8L3A+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5pbmZyYS5nZW5lcmFsLmdlbmVyYWwuQXBwbGljYWJpbGl0eUtpbmQNCgkgKiBAc2VlICNzZXRUeXBlKEFwcGxpY2FiaWxpdHlLaW5kKQ0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGttLnJlZmZyYW1ld29yay5yZWZmcmFtZXdvcmsuUmVmZnJhbWV3b3JrUGFja2FnZSNnZXRSZWZBcHBsaWNhYmlsaXR5UmVsX1R5cGUoKQ0KCSAqIEBtb2RlbA0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglBcHBsaWNhYmlsaXR5S2luZCBnZXRUeXBlKCk7DQoNCgkvKioNCgkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5wa20ucmVmZnJhbWV3b3JrLnJlZmZyYW1ld29yay5SZWZBcHBsaWNhYmlsaXR5UmVsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuaW5mcmEuZ2VuZXJhbC5nZW5lcmFsLkFwcGxpY2FiaWxpdHlLaW5kDQoJICogQHNlZSAjZ2V0VHlwZSgpDQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXZvaWQgc2V0VHlwZShBcHBsaWNhYmlsaXR5S2luZCB2YWx1ZSk7DQoNCgkvKioNCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDxwPg0KCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvdXJjZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQoJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KCSAqIDwvcD4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2U8L2VtPicgcmVmZXJlbmNlLg0KCSAqIEBzZWUgI3NldFNvdXJjZShSZWZBcHBsaWNhYmlsaXR5KQ0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGttLnJlZmZyYW1ld29yay5yZWZmcmFtZXdvcmsuUmVmZnJhbWV3b3JrUGFja2FnZSNnZXRSZWZBcHBsaWNhYmlsaXR5UmVsX1NvdXJjZSgpDQoJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglSZWZBcHBsaWNhYmlsaXR5IGdldFNvdXJjZSgpOw0KDQoJLyoqDQoJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGttLnJlZmZyYW1ld29yay5yZWZmcmFtZXdvcmsuUmVmQXBwbGljYWJpbGl0eVJlbCNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZS4NCgkgKiBAc2VlICNnZXRTb3VyY2UoKQ0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCgl2b2lkIHNldFNvdXJjZShSZWZBcHBsaWNhYmlsaXR5IHZhbHVlKTsNCg0KCS8qKg0KCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPHA+DQoJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCgkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQoJICogPC9wPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldDwvZW0+JyByZWZlcmVuY2UuDQoJICogQHNlZSAjc2V0VGFyZ2V0KFJlZkFwcGxpY2FiaWxpdHkpDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5wa20ucmVmZnJhbWV3b3JrLnJlZmZyYW1ld29yay5SZWZmcmFtZXdvcmtQYWNrYWdlI2dldFJlZkFwcGxpY2FiaWxpdHlSZWxfVGFyZ2V0KCkNCgkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCVJlZkFwcGxpY2FiaWxpdHkgZ2V0VGFyZ2V0KCk7DQoNCgkvKioNCgkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5wa20ucmVmZnJhbWV3b3JrLnJlZmZyYW1ld29yay5SZWZBcHBsaWNhYmlsaXR5UmVsI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59JyByZWZlcmVuY2UuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQ8L2VtPicgcmVmZXJlbmNlLg0KCSAqIEBzZWUgI2dldFRhcmdldCgpDQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXZvaWQgc2V0VGFyZ2V0KFJlZkFwcGxpY2FiaWxpdHkgdmFsdWUpOw0KDQp9IC8vIFJlZkFwcGxpY2FiaWxpdHlSZWwNCg==