LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogoCogCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwppbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5Ccm93c2VyRmFjdG9yeTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci8qKgogKiBAc2luY2UgMS4wCiAqLwpwdWJsaWMgY2xhc3MgQnJvd3NlckV4dCBpbXBsZW1lbnRzIElCcm93c2VyRXh0IHsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZBQ1RPUllfQ0xBU1MgPSAiZmFjdG9yeWNsYXNzIjsgLy8kTk9OLU5MUy0xJAoKCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7CgoJcHJpdmF0ZSBCcm93c2VyRmFjdG9yeSBkZWxlZ2F0ZTsKCgkvKioKCSAqIEJyb3dzZXJFeHQgY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIEJyb3dzZXJFeHQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKCQlzdXBlcigpOwoJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGJyb3dzZXIuCgkgKiAKCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIGdldElkKCkgewoJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAoJfQoKCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKCQlTdHJpbmcgbGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCgkJaWYgKGxhYmVsID09IG51bGwpCgkJCXJldHVybiAibi9hIjsgLy8kTk9OLU5MUy0xJAoJCXJldHVybiBsYWJlbDsKCX0KCglwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcnMoKSB7CgkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJwYXJhbWV0ZXJzIik7IC8vJE5PTi1OTFMtMSQKCX0KCglwdWJsaWMgU3RyaW5nIGdldEV4ZWN1dGFibGUoKSB7CgkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJleGVjdXRhYmxlIik7IC8vJE5PTi1OTFMtMSQKCX0KCglwdWJsaWMgU3RyaW5nIGdldE9TKCkgewoJCVN0cmluZyBvcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJvcyIpOyAvLyROT04tTkxTLTEkCgkJaWYgKG9zID09IG51bGwpCgkJCW9zID0gIiI7IC8vJE5PTi1OTFMtMSQKCQlyZXR1cm4gb3M7Cgl9CgoJcHVibGljIFN0cmluZ1tdIGdldERlZmF1bHRMb2NhdGlvbnMoKSB7CgkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwoJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZHJlbigibG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAoJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CgkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJbGlzdC5hZGQoY2hpbGRyZW5baV0uZ2V0VmFsdWUoKSk7CgkJCX0KCQl9CgoJCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKCQlsaXN0LnRvQXJyYXkocyk7CgkJcmV0dXJuIHM7Cgl9CgoJcHJvdGVjdGVkIEJyb3dzZXJGYWN0b3J5IGdldERlbGVnYXRlKCkgewoJCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7CgkJCWlmIChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0ZBQ1RPUllfQ0xBU1MpID09IG51bGwKCQkJCQl8fCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0ZBQ1RPUllfQ0xBU1MpLmxlbmd0aCgpID09IDApCgkJCQlyZXR1cm4gbnVsbDsKCgkJCXRyeSB7CgkJCQlkZWxlZ2F0ZSA9IChCcm93c2VyRmFjdG9yeSkgZWxlbWVudAoJCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSX0ZBQ1RPUllfQ0xBU1MpOwoJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJVHJhY2UKCQkJCQkJLnRyYWNlKAoJCQkJCQkJCVRyYWNlLlNFVkVSRSwKCQkJCQkJCQkiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCgkJCX0KCQl9CgkJcmV0dXJuIGRlbGVnYXRlOwoJfQoKCS8qKgoJICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZhY3RvcnkgY2FuIHdvcmsgb24gdGhlIHVzZXIgc3lzdGVtLgoJICogCgkgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSBmYWN0b3J5IGNhbm5vdCB3b3JrIG9uIHRoaXMgc3lzdGVtOyBmb3IgZXhhbXBsZSB0aGUKCSAqICAgICAgICAgcmVxdWlyZWQgbmF0aXZlIGJyb3dzZXIgcmVxdWlyZWQgYnkgYnJvd3NlciBhZGFwdGVycyB0aGF0IGl0CgkgKiAgICAgICAgIGNyZWF0ZXMgaXMgbm90IGluc3RhbGxlZAoJICovCglwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCAmJiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9GQUNUT1JZX0NMQVNTKSA9PSBudWxsCgkJCQl8fCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0ZBQ1RPUllfQ0xBU1MpLmxlbmd0aCgpID09IDApKQoJCQlyZXR1cm4gdHJ1ZTsKCQkKCQl0cnkgewoJCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5pc0F2YWlsYWJsZSgpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlCgkJCQkJLnRyYWNlKAoJCQkJCQkJVHJhY2UuU0VWRVJFLAoJCQkJCQkJIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgkvKioKCSAqIE9idGFpbnMgYSBuZXcgaW5zdGFuY2Ugb2YgYSB3ZWIgYnJvd3Nlci4KCSAqIAoJICogQHJldHVybiBpbnN0YW5jZSBvZiBJQnJvd3NlcgoJICovCglwdWJsaWMgSVdlYkJyb3dzZXIgY3JlYXRlQnJvd3NlcihTdHJpbmcgaWQsIFN0cmluZyBsb2NhdGlvbiwKCQkJU3RyaW5nIHBhcmFtZXRlcnMpIHsKCQl0cnkgewoJCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5jcmVhdGVCcm93c2VyKGlkLCBsb2NhdGlvbiwgcGFyYW1ldGVycyk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UKCQkJCQkudHJhY2UoCgkJCQkJCQlUcmFjZS5TRVZFUkUsCgkJCQkJCQkiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCVN0cmluZyBzID0gIkJyb3dzZXJFeHQ6ICIgKyBnZXRJZCgpICsgIiwgIiArIGdldE5hbWUoKSArICIsICIgKyBnZXRPUygpICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCgkJCQkrICIsICIgKyBnZXRFeGVjdXRhYmxlKCkgKyAiLCAiICsgZ2V0UGFyYW1ldGVycygpICsgIiwgIjsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKCQlTdHJpbmdbXSBsb2NhdGlvbnMgPSBnZXREZWZhdWx0TG9jYXRpb25zKCk7CgkJaWYgKGxvY2F0aW9ucyAhPSBudWxsKSB7CgkJCWludCBzaXplID0gbG9jYXRpb25zLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCXMgKz0gbG9jYXRpb25zW2ldICsgIjsiOyAvLyROT04tTkxTLTEkCgkJCX0KCQl9CgkJcmV0dXJuIHM7Cgl9Cn0=