LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKg0KICovDQpwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLnV0aWw7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cmFuY2Vhc3NldHMuYXNzdXJhbmNlYXNzZXQuQXNzdXJhbmNlQXNzZXQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VyYW5jZWFzc2V0cy5hc3N1cmFuY2Vhc3NldC5NYW5hZ2VhYmxlQXNzdXJhbmNlQXNzZXQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuKjsNCg0KLyoqDQogKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4NCiAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLg0KICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQogKiBAc2VlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFyZ1BhY2thZ2UNCiAqIEBnZW5lcmF0ZWQNCiAqLw0KcHVibGljIGNsYXNzIEFyZ0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsNCgkvKioNCgkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyBBcmdQYWNrYWdlIG1vZGVsUGFja2FnZTsNCg0KCS8qKg0KCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgQXJnQWRhcHRlckZhY3RvcnkoKSB7DQoJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgew0KCQkJbW9kZWxQYWNrYWdlID0gQXJnUGFja2FnZS5lSU5TVEFOQ0U7DQoJCX0NCgl9DQoNCgkvKioNCgkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQE92ZXJyaWRlDQoJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7DQoJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgew0KCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOw0KCQl9DQoJCXJldHVybiBmYWxzZTsNCgl9DQoNCgkvKioNCgkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHJvdGVjdGVkIEFyZ1N3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9DQoJCW5ldyBBcmdTd2l0Y2g8QWRhcHRlcj4oKSB7DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDYXNlKENhc2Ugb2JqZWN0KSB7DQoJCQkJcmV0dXJuIGNyZWF0ZUNhc2VBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNb2RlbEVsZW1lbnQoTW9kZWxFbGVtZW50IG9iamVjdCkgew0KCQkJCXJldHVybiBjcmVhdGVNb2RlbEVsZW1lbnRBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBc3N1cmFuY2VDYXNlKEFzc3VyYW5jZUNhc2Ugb2JqZWN0KSB7DQoJCQkJcmV0dXJuIGNyZWF0ZUFzc3VyYW5jZUNhc2VBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcmd1bWVudGF0aW9uRWxlbWVudChBcmd1bWVudGF0aW9uRWxlbWVudCBvYmplY3QpIHsNCgkJCQlyZXR1cm4gY3JlYXRlQXJndW1lbnRhdGlvbkVsZW1lbnRBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcmd1bWVudGF0aW9uKEFyZ3VtZW50YXRpb24gb2JqZWN0KSB7DQoJCQkJcmV0dXJuIGNyZWF0ZUFyZ3VtZW50YXRpb25BZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcmd1bWVudEVsZW1lbnQoQXJndW1lbnRFbGVtZW50IG9iamVjdCkgew0KCQkJCXJldHVybiBjcmVhdGVBcmd1bWVudEVsZW1lbnRBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJbmZvcm1hdGlvbkVsZW1lbnRDaXRhdGlvbihJbmZvcm1hdGlvbkVsZW1lbnRDaXRhdGlvbiBvYmplY3QpIHsNCgkJCQlyZXR1cm4gY3JlYXRlSW5mb3JtYXRpb25FbGVtZW50Q2l0YXRpb25BZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSZWFzb25pbmdFbGVtZW50KFJlYXNvbmluZ0VsZW1lbnQgb2JqZWN0KSB7DQoJCQkJcmV0dXJuIGNyZWF0ZVJlYXNvbmluZ0VsZW1lbnRBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcmd1bWVudEVsZW1lbnRDaXRhdGlvbihBcmd1bWVudEVsZW1lbnRDaXRhdGlvbiBvYmplY3QpIHsNCgkJCQlyZXR1cm4gY3JlYXRlQXJndW1lbnRFbGVtZW50Q2l0YXRpb25BZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBc3NlcnRpb24oQXNzZXJ0aW9uIG9iamVjdCkgew0KCQkJCXJldHVybiBjcmVhdGVBc3NlcnRpb25BZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcmd1bWVudFJlYXNvbmluZyhBcmd1bWVudFJlYXNvbmluZyBvYmplY3QpIHsNCgkJCQlyZXR1cm4gY3JlYXRlQXJndW1lbnRSZWFzb25pbmdBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDbGFpbShDbGFpbSBvYmplY3QpIHsNCgkJCQlyZXR1cm4gY3JlYXRlQ2xhaW1BZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBc3NlcnRlZFJlbGF0aW9uc2hpcChBc3NlcnRlZFJlbGF0aW9uc2hpcCBvYmplY3QpIHsNCgkJCQlyZXR1cm4gY3JlYXRlQXNzZXJ0ZWRSZWxhdGlvbnNoaXBBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaG9pY2UoQ2hvaWNlIG9iamVjdCkgew0KCQkJCXJldHVybiBjcmVhdGVDaG9pY2VBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBc3NlcnRlZEluZmVyZW5jZShBc3NlcnRlZEluZmVyZW5jZSBvYmplY3QpIHsNCgkJCQlyZXR1cm4gY3JlYXRlQXNzZXJ0ZWRJbmZlcmVuY2VBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBc3NlcnRlZEV2aWRlbmNlKEFzc2VydGVkRXZpZGVuY2Ugb2JqZWN0KSB7DQoJCQkJcmV0dXJuIGNyZWF0ZUFzc2VydGVkRXZpZGVuY2VBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBc3NlcnRlZENvbnRleHQoQXNzZXJ0ZWRDb250ZXh0IG9iamVjdCkgew0KCQkJCXJldHVybiBjcmVhdGVBc3NlcnRlZENvbnRleHRBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBc3NlcnRlZENoYWxsZW5nZShBc3NlcnRlZENoYWxsZW5nZSBvYmplY3QpIHsNCgkJCQlyZXR1cm4gY3JlYXRlQXNzZXJ0ZWRDaGFsbGVuZ2VBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBc3NlcnRlZENvdW50ZXJFdmlkZW5jZShBc3NlcnRlZENvdW50ZXJFdmlkZW5jZSBvYmplY3QpIHsNCgkJCQlyZXR1cm4gY3JlYXRlQXNzZXJ0ZWRDb3VudGVyRXZpZGVuY2VBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBZ3JlZW1lbnQoQWdyZWVtZW50IG9iamVjdCkgew0KCQkJCXJldHVybiBjcmVhdGVBZ3JlZW1lbnRBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBc3N1cmFuY2VBc3NldChBc3N1cmFuY2VBc3NldCBvYmplY3QpIHsNCgkJCQlyZXR1cm4gY3JlYXRlQXNzdXJhbmNlQXNzZXRBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNYW5hZ2VhYmxlQXNzdXJhbmNlQXNzZXQoTWFuYWdlYWJsZUFzc3VyYW5jZUFzc2V0IG9iamVjdCkgew0KCQkJCXJldHVybiBjcmVhdGVNYW5hZ2VhYmxlQXNzdXJhbmNlQXNzZXRBZGFwdGVyKCk7DQoJCQl9DQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7DQoJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7DQoJCQl9DQoJCX07DQoNCgkvKioNCgkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0Lg0KCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAT3ZlcnJpZGUNCglwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgew0KCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsNCgl9DQoNCg0KCS8qKg0KCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQ2FzZSA8ZW0+Q2FzZTwvZW0+fScuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQoJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5DYXNlDQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhc2VBZGFwdGVyKCkgew0KCQlyZXR1cm4gbnVsbDsNCgl9DQoNCgkvKioNCgkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLk1vZGVsRWxlbWVudCA8ZW0+TW9kZWwgRWxlbWVudDwvZW0+fScuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQoJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Nb2RlbEVsZW1lbnQNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIEFkYXB0ZXIgY3JlYXRlTW9kZWxFbGVtZW50QWRhcHRlcigpIHsNCgkJcmV0dXJuIG51bGw7DQoJfQ0KDQoJLyoqDQoJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bc3N1cmFuY2VDYXNlIDxlbT5Bc3N1cmFuY2UgQ2FzZTwvZW0+fScuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQoJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bc3N1cmFuY2VDYXNlDQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFzc3VyYW5jZUNhc2VBZGFwdGVyKCkgew0KCQlyZXR1cm4gbnVsbDsNCgl9DQoNCgkvKioNCgkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFyZ3VtZW50YXRpb25FbGVtZW50IDxlbT5Bcmd1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPn0nLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXJndW1lbnRhdGlvbkVsZW1lbnQNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJndW1lbnRhdGlvbkVsZW1lbnRBZGFwdGVyKCkgew0KCQlyZXR1cm4gbnVsbDsNCgl9DQoNCgkvKioNCgkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFyZ3VtZW50YXRpb24gPGVtPkFyZ3VtZW50YXRpb248L2VtPn0nLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXJndW1lbnRhdGlvbg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgQWRhcHRlciBjcmVhdGVBcmd1bWVudGF0aW9uQWRhcHRlcigpIHsNCgkJcmV0dXJuIG51bGw7DQoJfQ0KDQoJLyoqDQoJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bcmd1bWVudEVsZW1lbnQgPGVtPkFyZ3VtZW50IEVsZW1lbnQ8L2VtPn0nLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXJndW1lbnRFbGVtZW50DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFyZ3VtZW50RWxlbWVudEFkYXB0ZXIoKSB7DQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qKg0KCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuSW5mb3JtYXRpb25FbGVtZW50Q2l0YXRpb24gPGVtPkluZm9ybWF0aW9uIEVsZW1lbnQgQ2l0YXRpb248L2VtPn0nLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuSW5mb3JtYXRpb25FbGVtZW50Q2l0YXRpb24NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5mb3JtYXRpb25FbGVtZW50Q2l0YXRpb25BZGFwdGVyKCkgew0KCQlyZXR1cm4gbnVsbDsNCgl9DQoNCgkvKioNCgkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLlJlYXNvbmluZ0VsZW1lbnQgPGVtPlJlYXNvbmluZyBFbGVtZW50PC9lbT59Jy4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCgkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCgkgKiBAc2VlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLlJlYXNvbmluZ0VsZW1lbnQNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVhc29uaW5nRWxlbWVudEFkYXB0ZXIoKSB7DQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qKg0KCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXJndW1lbnRFbGVtZW50Q2l0YXRpb24gPGVtPkFyZ3VtZW50IEVsZW1lbnQgQ2l0YXRpb248L2VtPn0nLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXJndW1lbnRFbGVtZW50Q2l0YXRpb24NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJndW1lbnRFbGVtZW50Q2l0YXRpb25BZGFwdGVyKCkgew0KCQlyZXR1cm4gbnVsbDsNCgl9DQoNCgkvKioNCgkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFzc2VydGlvbiA8ZW0+QXNzZXJ0aW9uPC9lbT59Jy4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCgkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCgkgKiBAc2VlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFzc2VydGlvbg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgQWRhcHRlciBjcmVhdGVBc3NlcnRpb25BZGFwdGVyKCkgew0KCQlyZXR1cm4gbnVsbDsNCgl9DQoNCgkvKioNCgkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFyZ3VtZW50UmVhc29uaW5nIDxlbT5Bcmd1bWVudCBSZWFzb25pbmc8L2VtPn0nLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXJndW1lbnRSZWFzb25pbmcNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJndW1lbnRSZWFzb25pbmdBZGFwdGVyKCkgew0KCQlyZXR1cm4gbnVsbDsNCgl9DQoNCgkvKioNCgkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkNsYWltIDxlbT5DbGFpbTwvZW0+fScuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQoJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5DbGFpbQ0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgQWRhcHRlciBjcmVhdGVDbGFpbUFkYXB0ZXIoKSB7DQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qKg0KCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXNzZXJ0ZWRSZWxhdGlvbnNoaXAgPGVtPkFzc2VydGVkIFJlbGF0aW9uc2hpcDwvZW0+fScuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQoJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bc3NlcnRlZFJlbGF0aW9uc2hpcA0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgQWRhcHRlciBjcmVhdGVBc3NlcnRlZFJlbGF0aW9uc2hpcEFkYXB0ZXIoKSB7DQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qKg0KCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQ2hvaWNlIDxlbT5DaG9pY2U8L2VtPn0nLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQ2hvaWNlDQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNob2ljZUFkYXB0ZXIoKSB7DQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qKg0KCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXNzZXJ0ZWRJbmZlcmVuY2UgPGVtPkFzc2VydGVkIEluZmVyZW5jZTwvZW0+fScuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQoJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bc3NlcnRlZEluZmVyZW5jZQ0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgQWRhcHRlciBjcmVhdGVBc3NlcnRlZEluZmVyZW5jZUFkYXB0ZXIoKSB7DQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qKg0KCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXNzZXJ0ZWRFdmlkZW5jZSA8ZW0+QXNzZXJ0ZWQgRXZpZGVuY2U8L2VtPn0nLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXNzZXJ0ZWRFdmlkZW5jZQ0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgQWRhcHRlciBjcmVhdGVBc3NlcnRlZEV2aWRlbmNlQWRhcHRlcigpIHsNCgkJcmV0dXJuIG51bGw7DQoJfQ0KDQoJLyoqDQoJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bc3NlcnRlZENvbnRleHQgPGVtPkFzc2VydGVkIENvbnRleHQ8L2VtPn0nLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXNzZXJ0ZWRDb250ZXh0DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFzc2VydGVkQ29udGV4dEFkYXB0ZXIoKSB7DQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qKg0KCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXNzZXJ0ZWRDaGFsbGVuZ2UgPGVtPkFzc2VydGVkIENoYWxsZW5nZTwvZW0+fScuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQoJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bc3NlcnRlZENoYWxsZW5nZQ0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgQWRhcHRlciBjcmVhdGVBc3NlcnRlZENoYWxsZW5nZUFkYXB0ZXIoKSB7DQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qKg0KCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXNzZXJ0ZWRDb3VudGVyRXZpZGVuY2UgPGVtPkFzc2VydGVkIENvdW50ZXIgRXZpZGVuY2U8L2VtPn0nLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXNzZXJ0ZWRDb3VudGVyRXZpZGVuY2UNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXNzZXJ0ZWRDb3VudGVyRXZpZGVuY2VBZGFwdGVyKCkgew0KCQlyZXR1cm4gbnVsbDsNCgl9DQoNCgkvKioNCgkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFncmVlbWVudCA8ZW0+QWdyZWVtZW50PC9lbT59Jy4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCgkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCgkgKiBAc2VlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFncmVlbWVudA0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgQWRhcHRlciBjcmVhdGVBZ3JlZW1lbnRBZGFwdGVyKCkgew0KCQlyZXR1cm4gbnVsbDsNCgl9DQoNCgkvKioNCgkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cmFuY2Vhc3NldHMuYXNzdXJhbmNlYXNzZXQuQXNzdXJhbmNlQXNzZXQgPGVtPkFzc3VyYW5jZSBBc3NldDwvZW0+fScuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQoJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJhbmNlYXNzZXRzLmFzc3VyYW5jZWFzc2V0LkFzc3VyYW5jZUFzc2V0DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFzc3VyYW5jZUFzc2V0QWRhcHRlcigpIHsNCgkJcmV0dXJuIG51bGw7DQoJfQ0KDQoJLyoqDQoJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJhbmNlYXNzZXRzLmFzc3VyYW5jZWFzc2V0Lk1hbmFnZWFibGVBc3N1cmFuY2VBc3NldCA8ZW0+TWFuYWdlYWJsZSBBc3N1cmFuY2UgQXNzZXQ8L2VtPn0nLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VyYW5jZWFzc2V0cy5hc3N1cmFuY2Vhc3NldC5NYW5hZ2VhYmxlQXNzdXJhbmNlQXNzZXQNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWFuYWdlYWJsZUFzc3VyYW5jZUFzc2V0QWRhcHRlcigpIHsNCgkJcmV0dXJuIG51bGw7DQoJfQ0KDQoJLyoqDQoJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7DQoJCXJldHVybiBudWxsOw0KCX0NCg0KfSAvL0FyZ0FkYXB0ZXJGYWN0b3J5DQo=