LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmU7CgppbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvclBsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVHJhY2U7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci8qKgogKiBCYXNlIGNsYXNzIGZvciBvYnRhaW5pbmcgcmVmZXJlbmNlcyB0byBtb25pdG9yIG1vZGVscy4gVGhpcyBjbGFzcyBhbHNvIHByb3ZpZGUgbWV0aG9kcwogKiB0byBkbyBvcGVyYXRpb25zIG9uIHRoZSBtb25pdG9yLgogKiAKICogQHNpbmNlIDEuMAogKi8KcHVibGljIGNsYXNzIE1vbml0b3JDb3JlIHsKCS8vIFtpc3N1ZTogdGhlIHByb3RvY29scyBhcmUgc3RvcmVkIGluIGhlcmUuIFdoYXQgaWYgdGhlIGNsaWVudHMgb2YgdGhlIEFQSSBpbXBsZW1lbnRzIGEgbmV3IHByb3RvY29sP10KCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRDUElQX1BST1RPQ09MX0lEID0gIlRDUElQIjsKCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUVFBfUFJPVE9DT0xfSUQgPSAiSFRUUCI7CgoJcHJpdmF0ZSBzdGF0aWMgTW9uaXRvck1hbmFnZXIgbWFuYWdlciA9IE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7CgkKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwoJCgkvKioKCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBleGlzdGluZyBtb25pdG9ycy4KCSAqIAoJICogQHJldHVybiBhbiBhcnJheSBvZiBtb25pdG9ycwoJICovCglwdWJsaWMgc3RhdGljIElNb25pdG9yW10gZ2V0TW9uaXRvcnMoKSB7CgkJTGlzdCBsaXN0ID0gbWFuYWdlci5nZXRNb25pdG9ycygpOwoJCUlNb25pdG9yW10gbSA9IG5ldyBJTW9uaXRvcltsaXN0LnNpemUoKV07CgkJbGlzdC50b0FycmF5KG0pOwoJCXJldHVybiBtOwoJfQoJCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBtb25pdG9yLgoJICogCgkgKiBAcmV0dXJuIGEgd29ya2luZyBjb3B5IG9mIHRoZSBjcmVhdGVkIG1vbml0b3IuCgkgKi8KCXB1YmxpYyBzdGF0aWMgSU1vbml0b3JXb3JraW5nQ29weSBjcmVhdGVNb25pdG9yKCkgewoJCXJldHVybiBtYW5hZ2VyLmNyZWF0ZU1vbml0b3IoKTsKCX0KCQoJLyoqCgkgKiBTdGFydCB0aGUgZ2l2ZW4gbW9uaXRvci4KCSAqIAoJICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdG8gYmUgc3RhcnRlZC4KCSAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBtb25pdG9yIGZhaWwgdG8gc3RhcnQuCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydE1vbml0b3IoSU1vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJbWFuYWdlci5zdGFydE1vbml0b3IobW9uaXRvcik7Cgl9CgkKCS8qKgoJICogU3RvcCB0aGUgZ2l2ZW4gbW9uaXRvci4KCSAqIAoJICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdG8gYmUgc3RvcHBlZC4KCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIHN0b3BNb25pdG9yKElNb25pdG9yIG1vbml0b3IpIHsKCQltYW5hZ2VyLnN0b3BNb25pdG9yKG1vbml0b3IpOwoJfQoJCgkvKioKCSAqIFJldHVybiB0aGUgcHJvdG9jb2wgYWRhcHRlcnMuCgkgKiAKCSAqIEByZXR1cm4gYXJyYXkgb2YgcHJvdG9jb2wgYWRhcHRlcnMKCSAqLwoJcHVibGljIHN0YXRpYyBJUHJvdG9jb2xBZGFwdGVyW10gZ2V0UHJvdG9jb2xBZGFwdGVycygpIHsKCQlyZXR1cm4gTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb3RvY29sQWRhcHRlcnMoKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm4gdGhlIHByb3RvY29sIGFkYXB0ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQuCgkgKiAKCSAqIEByZXR1cm4gcHJvdG9jb2wgYWRhcHRlcgoJICovCglwdWJsaWMgc3RhdGljIElQcm90b2NvbEFkYXB0ZXIgZ2V0UHJvdG9jb2xBZGFwdGVyKFN0cmluZyBpZCkgewoJCXJldHVybiBNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJvdG9jb2xBZGFwdGVyKGlkKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm4gdGhlIGNvbnRlbnQgZmlsdGVycy4KCSAqIAoJICogQHJldHVybiBhcnJheSBvZiBjb250ZW50IGZpbHRlcnMKCSAqLwoJcHVibGljIHN0YXRpYyBJQ29udGVudEZpbHRlcltdIGdldENvbnRlbnRGaWx0ZXJzKCkgewoJCXJldHVybiBNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0Q29udGVudEZpbHRlcnMoKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm4gdGhlIGNvbnRlbnQgZmlsdGVyIHdpdGggdGhlIGdpdmVuIGlkLgoJICogCgkgKiBAcmV0dXJuIGNvbnRlbnQgZmlsdGVyCgkgKi8KCXB1YmxpYyBzdGF0aWMgSUNvbnRlbnRGaWx0ZXIgZ2V0Q29udGVudEZpbHRlcihTdHJpbmcgaWQpIHsKCQlyZXR1cm4gTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRGaWx0ZXIoaWQpOwoJfQoJCgkvKioKCSAqIEFkZCBhIG1vbml0b3IgbGlzdGVuZXIuCgkgKiBPbmNlIHJlZ2lzdGVyZWQsIGEgbGlzdGVuZXIgc3RhcnRzIHJlY2VpdmluZyBub3RpZmljYXRpb24gb2YgCgkgKiBjaGFuZ2VzIHRvIHRoZSBtb25pdG9ycy4gVGhlIGxpc3RlbmVyIGNvbnRpbnVlcyB0byByZWNlaXZlCgkgKiBub3RpZmljYXRpb25zIHVudGlsIGl0IGlzIHJlbW92ZWQuCgkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCgkgKgoJICogQHBhcmFtIGxpc3RlbmVyIHRoZSBtb25pdG9yIGxpc3RlbmVyCgkgKiBAc2VlICNyZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lcikKCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIGFkZE1vbml0b3JMaXN0ZW5lcihJTW9uaXRvckxpc3RlbmVyIGxpc3RlbmVyKSB7CgkJbWFuYWdlci5hZGRNb25pdG9yTGlzdGVuZXIobGlzdGVuZXIpOwoJfQoKCS8qKgoJICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbW9uaXRvciBsaXN0ZW5lci4gSGFzIG5vCgkgKiBlZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgoJICogCgkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCgkgKiBAc2VlICNhZGRNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lcikKCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU1vbml0b3JMaXN0ZW5lcihJTW9uaXRvckxpc3RlbmVyIGxpc3RlbmVyKSB7CgkJbWFuYWdlci5yZW1vdmVNb25pdG9yTGlzdGVuZXIobGlzdGVuZXIpOwoJfQoKCS8qKgoJICogUmV0dXJuIGFuIGFycmF5IG9mIGFsbCByZXF1ZXN0cy4KCSAqIAoJICogQHJldHVybiBhbiBhcnJheSBvZiBhbGwgcmVxdWVzdHMuCgkgKi8KCXB1YmxpYyBzdGF0aWMgSVJlcXVlc3RbXSBnZXRSZXF1ZXN0cygpIHsKCQlMaXN0IGxpc3QgPSBtYW5hZ2VyLmdldFJlcXVlc3RzKCk7CgkJSVJlcXVlc3RbXSByID0gbmV3IElSZXF1ZXN0W2xpc3Quc2l6ZSgpXTsKCQlsaXN0LnRvQXJyYXkocik7CgkJcmV0dXJuIHI7Cgl9CgkKCS8qKgoJICogUmVtb3ZlIGFsbCByZXF1ZXN0cy4KCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFJlcXVlc3RzKCkgewoJCW1hbmFnZXIucmVtb3ZlQWxsUmVxdWVzdHMoKTsKCX0KCQoJLyoqCgkgKiBBZGQgYSByZXF1ZXN0IGxpc3RlbmVyLgoJICogT25jZSByZWdpc3RlcmVkLCBhIGxpc3RlbmVyIHN0YXJ0cyByZWNlaXZpbmcgbm90aWZpY2F0aW9uIG9mIAoJICogY2hhbmdlcyB0byB0aGUgcmVxdWVzdHMuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZQoJICogbm90aWZpY2F0aW9ucyB1bnRpbCBpdCBpcyByZW1vdmVkLgoJICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgoJICoKCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgcmVxdWVzdCBsaXN0ZW5lcgoJICogQHNlZSAjcmVtb3ZlUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIpCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcikgewoJCW1hbmFnZXIuYWRkUmVxdWVzdExpc3RlbmVyKGxpc3RlbmVyKTsKCX0KCgkvKioKCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHJlcXVlc3QgbGlzdGVuZXIuIEhhcyBubwoJICogZWZmZWN0IGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KCSAqIAoJICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgoJICogQHNlZSAjYWRkUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIpCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcikgewoJCW1hbmFnZXIucmVtb3ZlUmVxdWVzdExpc3RlbmVyKGxpc3RlbmVyKTsKCX0KCQoJLyoqCgkgKiBQYXJzZSB0aGUgZ2l2ZW4gYnl0ZXMgaW50byBTdHJpbmcgZm9ybS4KCSAqIAoJICogQHBhcmFtIGIgdGhlIGlucHV0IGJ5dGVzCgkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgYWZ0ZXIgdGhlIGNvbnZlcnNpb24uCgkgKi8KCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlKGJ5dGVbXSBiKSB7CgkJaWYgKGIgPT0gbnVsbCkKCQkJcmV0dXJuICIiOwoKCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYik7CgkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGJpbikpOwoJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKCQl0cnkgewoJCQlTdHJpbmcgcyA9IGJyLnJlYWRMaW5lKCk7CgkJCQoJCQl3aGlsZSAocyAhPSBudWxsKSB7CgkJCQlzYi5hcHBlbmQocyk7CgkJCQlzID0gYnIucmVhZExpbmUoKTsKCQkJCWlmIChzICE9IG51bGwpCgkJCQkJc2IuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcGFyc2luZyBpbnB1dCIsIGUpOwoJCX0KCQkKCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKCX0KCgkvKioKCSAqIENyZWF0ZSBhbmQgcmV0dXJuIGFuIG5ldyBJUmVzZW5kUmVxdWVzdCBmcm9tIHRoZSBzcGVjaWZpZWQgcmVxdWVzdC4KCSAqIAoJICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QgdGhhdCBpcyB0byBiZSByZXNlbnQuCgkgKiBAcmV0dXJuIEEgbmV3IElSZXNlbmRSZXF1ZXN0IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcmVxdWVzdC4KCSAqLwoJcHVibGljIHN0YXRpYyBJUmVzZW5kUmVxdWVzdCBjcmVhdGVSZXNlbmRSZXF1ZXN0KElSZXF1ZXN0IHJlcXVlc3QpIHsKCSAgcmV0dXJuIG5ldyBSZXNlbmRIVFRQUmVxdWVzdChyZXF1ZXN0KTsKCX0KfQ==