LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwoKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwovKioKICogCiAqLwpwdWJsaWMgY2xhc3MgQnJvd3NlckRlc2NyaXB0b3IgaW1wbGVtZW50cyBJQnJvd3NlckRlc2NyaXB0b3IgewoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fTE9DQVRJT04gPSAibG9jYXRpb24iOyAvLyROT04tTkxTLTEkCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNRU5UT19QQVJBTUVURVJTID0gInBhcmFtZXRlcnMiOyAvLyROT04tTkxTLTEkCgoJcHJvdGVjdGVkIFN0cmluZyBuYW1lOwoJcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbjsKCXByb3RlY3RlZCBTdHJpbmcgcGFyYW1ldGVyczsKCQoJLyogKG5vbi1KYXZhZG9jKQoJICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLklXZWJCcm93c2VyI2dldE5hbWUoKQoJICovCglwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLyogKG5vbi1KYXZhZG9jKQoJICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLklCcm93c2VyRGVzY3JpcHRvciNnZXRMb2NhdGlvbigpCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7CgkJcmV0dXJuIGxvY2F0aW9uOwoJfQoKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5JQnJvd3NlckRlc2NyaXB0b3IjZ2V0UGFyYW1ldGVycygpCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVycygpIHsKCQlyZXR1cm4gcGFyYW1ldGVyczsKCX0KCQoJcHVibGljIHZvaWQgZGVsZXRlKCkgewoJCUJyb3dzZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlV2ViQnJvd3Nlcih0aGlzKTsKCX0KCglwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgewoJCXJldHVybiBmYWxzZTsKCX0KCglwdWJsaWMgSUJyb3dzZXJEZXNjcmlwdG9yV29ya2luZ0NvcHkgZ2V0V29ya2luZ0NvcHkoKSB7CgkJcmV0dXJuIG5ldyBCcm93c2VyRGVzY3JpcHRvcldvcmtpbmdDb3B5KHRoaXMpOwoJfQoKCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsKElCcm93c2VyRGVzY3JpcHRvciBicm93c2VyKSB7CgkJbmFtZSA9IGJyb3dzZXIuZ2V0TmFtZSgpOwoJCWxvY2F0aW9uID0gYnJvd3Nlci5nZXRMb2NhdGlvbigpOwoJCXBhcmFtZXRlcnMgPSBicm93c2VyLmdldFBhcmFtZXRlcnMoKTsKCX0KCglwcm90ZWN0ZWQgdm9pZCBzYXZlKElNZW1lbnRvIG1lbWVudG8pIHsKCQltZW1lbnRvLnB1dFN0cmluZyhNRU1FTlRPX05BTUUsIG5hbWUpOwoJCW1lbWVudG8ucHV0U3RyaW5nKE1FTUVOVE9fTE9DQVRJT04sIGxvY2F0aW9uKTsKCQltZW1lbnRvLnB1dFN0cmluZyhNRU1FTlRPX1BBUkFNRVRFUlMsIHBhcmFtZXRlcnMpOwoJfQoKCXByb3RlY3RlZCB2b2lkIGxvYWQoSU1lbWVudG8gbWVtZW50bykgewoJCW5hbWUgPSBtZW1lbnRvLmdldFN0cmluZyhNRU1FTlRPX05BTUUpOwoJCWxvY2F0aW9uID0gbWVtZW50by5nZXRTdHJpbmcoTUVNRU5UT19MT0NBVElPTik7CgkJcGFyYW1ldGVycyA9IG1lbWVudG8uZ2V0U3RyaW5nKE1FTUVOVE9fUEFSQU1FVEVSUyk7Cgl9CgoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlyZXR1cm4gIkV4dGVybmFsIFdlYiBicm93c2VyOiAiICsgZ2V0TmFtZSgpICsgIiAvICIgKyBnZXRMb2NhdGlvbigpICsgIiAvICIgKyBnZXRQYXJhbWV0ZXJzKCk7ICAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkCgl9Cn0=