LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA4IEplc3BlciBTdGVlbiBN+GxsZXIKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICoKICogQ29udHJpYnV0b3JzOgogKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGluaXRpYWwgWFNMIGxhdW5jaGluZyB0ZXN0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy50ZXN0Y2FzZTsKCmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKCmltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CmltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwppbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwppbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy5UZXN0RW52aXJvbm1lbnQ7CmltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKCnB1YmxpYyBjbGFzcyBYU0xMYXVuY2hpbmdUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKCQoJcHJpdmF0ZSBUZXN0RW52aXJvbm1lbnQgX2VudjsKCXByaXZhdGUgSVByb2plY3QJCV90ZXN0UHJvamVjdDsKCglwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewoJCXN1cGVyLnNldFVwKCk7CgkJX2VudiA9IG5ldyBUZXN0RW52aXJvbm1lbnQoKTsKCQlfdGVzdFByb2plY3QgPSBfZW52LmNyZWF0ZVByb2plY3QoIlhTTFRlc3RQcm9qZWN0Iik7Cgl9CgoJcHVibGljIHZvaWQgdGVzdEJ1aWxkQ29uZmlnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKCQlJUGF0aCBmb2xkZXIgPSBfdGVzdFByb2plY3QuZ2V0RnVsbFBhdGgoKTsKCQlfZW52LmFkZEZpbGVGcm9tUmVzb3VyY2UoZm9sZGVyLCAiaW5wdXQueG1sIiwgIjEtaW5wdXQueG1sIik7CgkJX2Vudi5hZGRGaWxlRnJvbVJlc291cmNlKGZvbGRlciwgInRyYW5zZm9ybS54c2wiLCAiMS10cmFuc2Zvcm0ueHNsIik7CgoJCVN0cmluZyBsYXVuY2hYbWwgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwibm9cIj8+XHJcbiIgKyAKCQkJCSI8bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvblR5cGVcIj5cclxuIiArIAoJCQkJIjxzdHJpbmdBdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9JTlBVVF9GSUxFXCIgdmFsdWU9XCIke3dvcmtzcGFjZV9sb2M6L1hTTFRlc3RQcm9qZWN0L2lucHV0LnhtbH1cIi8+XHJcbiIgKyAKCQkJCSI8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX09QRU5fRklMRVwiIHZhbHVlPVwiZmFsc2VcIi8+XHJcbiIgKyAKCQkJCSI8c3RyaW5nQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLkFUVFJfT1VUUFVUX0ZJTEVcIiB2YWx1ZT1cIiR7d29ya3NwYWNlX2xvYzovWFNMVGVzdFByb2plY3R9L291dHB1dC54bWxcIi8+XHJcbiIgKyAKCQkJCSI8c3RyaW5nQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLkFUVFJfT1VUUFVUX1BST1BFUlRJRVNcIiB2YWx1ZT1cIiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7IHN0YW5kYWxvbmU9JnF1b3Q7bm8mcXVvdDs/Jmd0OyYjMTM7JiMxMDsmbHQ7UHJvcGVydGllcyZndDsmIzEzOyYjMTA7Jmx0O1Byb3BlcnR5IG5hbWU9JnF1b3Q7aW5kZW50JnF1b3Q7IHZhbHVlPSZxdW90O3llcyZxdW90Oy8mZ3Q7JiMxMzsmIzEwOyZsdDsvUHJvcGVydGllcyZndDsmIzEzOyYjMTA7XCIvPlxyXG4iICsgCgkJCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX1BJUEVMSU5FXCIgdmFsdWU9XCImbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90OyBzdGFuZGFsb25lPSZxdW90O25vJnF1b3Q7PyZndDsmIzEzOyYjMTA7Jmx0O1BpcGVsaW5lJmd0OyYjMTM7JiMxMDsmbHQ7T3V0cHV0UHJvcGVydGllcy8mZ3Q7JiMxMzsmIzEwOyZsdDtUcmFuc2Zvcm0gcGF0aD0mcXVvdDsvWFNMVGVzdFByb2plY3QvdHJhbnNmb3JtLnhzbCZxdW90OyBwYXRoVHlwZT0mcXVvdDtyZXNvdXJjZSZxdW90OyB1cmlSZXNvbHZlcj0mcXVvdDsmcXVvdDsmZ3Q7JiMxMzsmIzEwOyZsdDtQYXJhbWV0ZXJzLyZndDsmIzEzOyYjMTA7Jmx0Oy9UcmFuc2Zvcm0mZ3Q7JiMxMzsmIzEwOyZsdDsvUGlwZWxpbmUmZ3Q7JiMxMzsmIzEwO1wiLz5cclxuIiArIAoJCQkJIjxzdHJpbmdBdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9QUk9DRVNTT1JcIiB2YWx1ZT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpyZS5kZWZhdWx0XCIvPlxyXG4iICsgCgkJCQkiPGJvb2xlYW5BdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9VU0VfREVGQVVMVF9PVVRQVVRfRklMRVwiIHZhbHVlPVwiZmFsc2VcIi8+XHJcbiIgKyAKCQkJCSI8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUlwiIHZhbHVlPVwiZmFsc2VcIi8+XHJcbiIgKyAKCQkJCSI8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX1VTRV9GRUFUVVJFU19GUk9NX1BSRUZFUkVOQ0VTXCIgdmFsdWU9XCJ0cnVlXCIvPlxyXG4iICsgCgkJCQkiPGJvb2xlYW5BdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9VU0VfUFJPUEVSVElFU19GUk9NX1BSRUZFUkVOQ0VTXCIgdmFsdWU9XCJ0cnVlXCIvPlxyXG4iICsgCgkJCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JTlZPS0VSX0RFU0NSSVBUT1JcIiB2YWx1ZT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpheHAuaW52b2tlXCIvPlxyXG4iICsgCgkJCQkiPC9sYXVuY2hDb25maWd1cmF0aW9uPiI7CgkJCgkJU3RyaW5nIG5hbWUgPSAibGF1bmNoIiArIChpbnQpKE1hdGgucmFuZG9tKCkqMTAwMCk7CgkJX2Vudi5hZGRGaWxlKGZvbGRlciwgbmFtZSArICIubGF1bmNoIiwgbGF1bmNoWG1sKTsKCQkKCQlJTGF1bmNoTWFuYWdlciBtZ3IgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOyAgCgkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBhbGxDb25maWdzID0gbWdyLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKCk7CgkJSUxhdW5jaENvbmZpZ3VyYXRpb24gbWluZSA9IG51bGw7CgkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwoJCWZvciAoSUxhdW5jaENvbmZpZ3VyYXRpb24gbGMgOiBhbGxDb25maWdzKSB7CgkJCWlmIChsYy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CgkJCQlmb3VuZCA9IHRydWU7CgkJCQltaW5lID0gbGM7CgkJCQlhc3NlcnRFcXVhbHMoImJhZCBsYXVuY2ggY29uZmlnIHR5cGU/IiwgIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIiwgbGMuZ2V0VHlwZSgpLmdldElkZW50aWZpZXIoKSk7CgkJCQlhc3NlcnRFcXVhbHMoImJhZCBsYXVuY2ggY29uZmlnIHBsdWdpbj8iLCAib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmciLCBsYy5nZXRUeXBlKCkuZ2V0UGx1Z2luSWRlbnRpZmllcigpKTsKCQkJfQoJCX0KCQlhc3NlcnRUcnVlKCJleHBlY3RlZCB0byBmaW5kIHRoZSBsYXVuY2ggY29uZmlnIHdlIGp1c3QgYWRkZWQiLCBmb3VuZCk7CgoJCUlMYXVuY2ggbGF1bmNoID0gbWluZS5sYXVuY2goSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgMjAwICYmICEgbGF1bmNoLmlzVGVybWluYXRlZCgpOyArK2kpIHsKCQkJU3lzdGVtLm91dC5wcmludGxuKCJ3YWl0aW5nIik7CgkJCVRocmVhZC5zbGVlcCgxMDApOwoJCX0KCQlpZiAoISBsYXVuY2guaXNUZXJtaW5hdGVkKCkpIHsKCQkJU3lzdGVtLm91dC5wcmludGxuKCJHb3QgdGlyZWQgb2Ygd2FpdGluZywgdGVybWluYXRpbmciKTsKCQkJbGF1bmNoLnRlcm1pbmF0ZSgpOwoJCX0KCQlfdGVzdFByb2plY3QucmVmcmVzaExvY2FsKDIsIG51bGwpOwoJCUlGaWxlIG91dHB1dCA9IF90ZXN0UHJvamVjdC5nZXRGaWxlKCJvdXRwdXQueG1sIik7CgkJRG9jdW1lbnQgZG9jID0gcGFyc2VYbWwob3V0cHV0LmdldENvbnRlbnRzKHRydWUpKTsKCQkKCQlhc3NlcnRFcXVhbHMoInJvb3Qtb3V0IiwgZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldE5vZGVOYW1lKCkpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0Tm90aGluZygpIHsJCgl9CgkKCXN0YXRpYyBwcml2YXRlIERvY3VtZW50IHBhcnNlWG1sKElucHV0U3RyZWFtIGNvbnRlbnRzKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CgkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBidWlsZGVyRmFjdG9yeSA9CgkJCSAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwoJCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9CgkJCSAgYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CgkJCQoJCQlyZXR1cm4gYnVpbGRlci5wYXJzZShjb250ZW50cyk7Cgl9CgoJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlfZW52LmRpc3Bvc2UoKTsKCQlzdXBlci50ZWFyRG93bigpOwoJfQp9Cg==