LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwppbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CgpjbGFzcyBTeWJhc2UKCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKewoJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZHRwVmVuZG9yTmFtZTsKCglzdGF0aWMgZmluYWwgVmVuZG9yIEFTQSA9IG5ldyBTeWJhc2UoIlN5YmFzZV9BU0EiKTsgLy8kTk9OLU5MUy0xJAoJc3RhdGljIGZpbmFsIFZlbmRvciBBU0UgPSBuZXcgU3liYXNlKCJTeWJhc2VfQVNFIik7IC8vJE5PTi1OTFMtMSQKCglzdGF0aWMgVmVuZG9yIGFzYSgpIHsKCQlyZXR1cm4gQVNBOwoJfQoKCXN0YXRpYyBWZW5kb3IgYXNlKCkgewoJCXJldHVybiBBU0U7Cgl9CgoJLyoqCgkgKiBFbnN1cmUgb25seSBzdGF0aWMgaW5zdGFuY2VzLgoJICovCglwcml2YXRlIFN5YmFzZShTdHJpbmcgZHRwVmVuZG9yTmFtZSkgewoJCXN1cGVyKCk7CgkJdGhpcy5kdHBWZW5kb3JOYW1lID0gZHRwVmVuZG9yTmFtZTsKCX0KCglAT3ZlcnJpZGUKCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKCQlyZXR1cm4gdGhpcy5kdHBWZW5kb3JOYW1lOwoJfQoKCUBPdmVycmlkZQoJQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKCQlyZXR1cm4gU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Cgl9CgoJLyoqCgkgKiBCeSBkZWZhdWx0LCBTeWJhc2UgaWRlbnRpZmllcnMgYXJlIGNhc2Utc2Vuc2l0aXZlLCBldmVuIHdpdGhvdXQKCSAqIGRlbGltaXRlcnMuIFRoaXMgY2FuIGRlcGVuZCBvbiB0aGUgY29sbGF0aW9uIHNldHRpbmcuLi4uCgkgKi8KCUBPdmVycmlkZQoJRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Cgl9CgoJLyoqCgkgKiBUaGUgdHlwaWNhbCBkZWZhdWx0IHNjaGVtYSBvbiBTeWJhc2UgZm9yIGFueSBkYXRhYmFzZSAoY2F0YWxvZykgaXMKCSAqICdkYm8nLgoJICogCgkgKiBBY3R1YWxseSwgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIG1vcmUgbGlrZSBhIHNlYXJjaCBwYXRoOgoJICogVGhlIHNlcnZlciBsb29rcyBmb3IgYSBzY2hlbWEgb2JqZWN0IChlLmcgdGFibGUpIGZpcnN0IGluIHRoZSB1c2VyJ3MKCSAqIHNjaGVtYSwgdGhlIGl0IGxvb2sgZm9yIHRoZSBzY2hlbWEgb2JqZWN0IGluIHRoZSBkYXRhYmFzZSBvd25lcidzCgkgKiBzY2hlbWEgKGRibykuIEFzIGEgcmVzdWx0LCBpdCdzIHJlYWxseSBub3QgcG9zc2libGUgdG8gc3BlY2lmeQoJICogdGhlICJkZWZhdWx0IiBzY2hlbWEgd2l0aG91dCBrbm93aW5nIHRoZSBzY2hlbWEgb2JqZWN0IHdlIGFyZQoJICogbG9va2luZyBmb3IuCgkgKiAKCSAqIChOb3RlOiB0aGUgY3VycmVudCAndXNlcicgaXMgbm90IHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBjdXJyZW50CgkgKiAnbG9naW4nIC0gc2VlIHNwX2FkZHVzZXIgYW5kIHNwX2FkZGxvZ2luOyBzbyB3ZSBwcm9iYWJseSBjYW4ndAoJICogdXNlIENvbm5lY3Rpb25Qcm9maWxlI2dldFVzZXJOYW1lKCkuKQoJICovCglAT3ZlcnJpZGUKCXZvaWQgYWRkRGVmYXVsdFNjaGVtYUlkZW50aWZpZXJzVG8oRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSwgQXJyYXlMaXN0PFN0cmluZz4gaWRlbnRpZmllcnMpIHsKCQlpZGVudGlmaWVycy5hZGQoREVGQVVMVF9TQ0hFTUFfTkFNRSk7Cgl9Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQ0hFTUFfTkFNRSA9ICJkYm8iOyAgLy8kTk9OLU5MUy0xJAoKCUBPdmVycmlkZQoJY2hhcltdIGdldEV4dGVuZGVkTm9ybWFsTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKCQlyZXR1cm4gRVhURU5ERURfTk9STUFMX05BTUVfU1RBUlRfQ0hBUkFDVEVSUzsKCX0KCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9OT1JNQUxfTkFNRV9TVEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICdfJywgJ0AnIH07CgoJQE92ZXJyaWRlCgljaGFyW10gZ2V0RXh0ZW5kZWROb3JtYWxOYW1lUGFydENoYXJhY3RlcnMoKSB7CgkJcmV0dXJuIEVYVEVOREVEX05PUk1BTF9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKCX0KCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9OT1JNQUxfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJyQnLCAnpScsICejJywgJyMnIH07CgoJLyoqCgkgKiBCeSBkZWZhdWx0LCBTeWJhc2UgZGVsaW1pdHMgaWRlbnRpZmllcnMgd2l0aCBicmFja2V0cyAoW10pOyBidXQgaXQKCSAqIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGRvdWJsZS1xdW90ZXMuCgkgKi8KCUBPdmVycmlkZQoJYm9vbGVhbiBpZGVudGlmaWVySXNEZWxpbWl0ZWQoU3RyaW5nIGlkZW50aWZpZXIpIHsKCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQoaWRlbnRpZmllcikKCQkJCQl8fCBzdXBlci5pZGVudGlmaWVySXNEZWxpbWl0ZWQoaWRlbnRpZmllcik7Cgl9Cgp9Cg==