LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDExIHByb3RvcyBzb2Z0d2FyZSBnbWJoIChodHRwOi8vd3d3LnByb3Rvcy5kZSkuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KICoKICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICogCiAqIENPTlRSSUJVVE9SUzoKICogCQlIZW5yaWsgUmVudHotUmVpY2hlcnQgKGluaXRpYWwgY29udHJpYnV0aW9uKQogKiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLmV0cmljZS5nZW5lcmF0b3IuZG9jLmdlbgoKaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdAppbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uCmltcG9ydCBqYXZhLmlvLkZpbGUKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmV0cmljZWdlbi5BYnN0cmFjdEluc3RhbmNlCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5nZW5tb2RlbC5ldHJpY2VnZW4uQWN0b3JJbnN0YW5jZQppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmNvcmUuZ2VubW9kZWwuZXRyaWNlZ2VuLkFjdG9ySW50ZXJmYWNlSW5zdGFuY2UKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmV0cmljZWdlbi5Sb290CmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuY29yZS5nZW5tb2RlbC5ldHJpY2VnZW4uU3RydWN0dXJlSW5zdGFuY2UKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmdlbm1vZGVsLmV0cmljZWdlbi5TeXN0ZW1JbnN0YW5jZQppbXBvcnQgb3JnLmVjbGlwc2UuZXRyaWNlLmdlbmVyYXRvci5nZW5lcmljLlJvb21FeHRlbnNpb25zCgppbXBvcnQgc3RhdGljIGphdmEubGFuZy5SdW50aW1lLioKaW1wb3J0IG9yZy5lY2xpcHNlLmV0cmljZS5jb3JlLmV0bWFwLnV0aWwuRVRNYXBVdGlsCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmJhc2UubG9nZ2luZy5JTG9nZ2VyCmltcG9ydCBvcmcuZWNsaXBzZS5ldHJpY2UuZ2VuZXJhdG9yLmJhc2UuaW8uSUdlbmVyYXRvckZpbGVJTwoKQFNpbmdsZXRvbgpjbGFzcyBJbnN0YW5jZURpYWdyYW1HZW4gewoKCUBJbmplY3QgZXh0ZW5zaW9uIElHZW5lcmF0b3JGaWxlSU8gZmlsZUlPCglASW5qZWN0IGV4dGVuc2lvbiBSb29tRXh0ZW5zaW9ucyByb29tRXh0CglASW5qZWN0IElMb2dnZXIgbG9nZ2VyCgkKCWRlZiBkb0dlbmVyYXRlKFJvb3Qgcm9vdCkgewoJCWZvciAobW9kZWw6IHJvb3QubW9kZWxzKSB7CgkJCXZhciBwYXRoID0gImltYWdlcy8iCgkJCXZhciBiYXRjaEZpbGUgPSAiZG90MmpwZy5iYXQiCgkJCWZvciAoc3lzIDogcm9vdC5zeXN0ZW1JbnN0YW5jZXMpIHsKCQkJCXZhciBmaWxlID0gc3lzLm5hbWUrIl9pbnN0YW5jZVRyZWUuZG90IgoJCQkJZmlsZUlPLmdlbmVyYXRlRmlsZSgiZ2VuZXJhdGluZyBpbnN0YW5jZSB0cmVlIGRpYWdyYW0iLCBwYXRoICsgZmlsZSwgcm9vdC5nZW5lcmF0ZShzeXMpKQoJCQl9CgkJCWZpbGVJTy5nZW5lcmF0ZUZpbGUocGF0aCArIGJhdGNoRmlsZSwgcm9vdC5nZW5lcmF0ZTJqcGcoKSkKCQkJcnVuRG90MkpwZyhwYXRoLCBiYXRjaEZpbGUpCgkJfQoJfQoJCgkvLyBnZW5lcmF0ZSBiYXRjaCBmaWxlIHRvIGNvbnZlcnQgLmRvdCB0byAuanBnCgkvLyBkb3QgLVRqcGcgLW9TUy5qcGcgU1MuZG90CQoJZGVmIHByaXZhdGUgZ2VuZXJhdGUyanBnKFJvb3Qgcm9vdCl7CgkJJycnCgkJCatGT1Igc3lzIDogcm9vdC5zeXN0ZW1JbnN0YW5jZXO7CgkJCQlkb3QgLVRqcGcgLW8gq3N5cy5uYW1lu19pbnN0YW5jZVRyZWUuanBnIKtzeXMubmFtZbtfaW5zdGFuY2VUcmVlLmRvdAoJCQmrRU5ERk9SuwoJCScnJwoJfQoJCglkZWYgcHJpdmF0ZSBnZW5lcmF0ZShSb290IHJvb3QsIFN5c3RlbUluc3RhbmNlIHN5cykgewoJCScnJwoJCQlkaWdyYXBoIKtzeXMubmFtZbsgewoJCQkJcmFua2Rpcj1MUjsKCQkJCW5vZGUgW3NoYXBlPWJveF07CgkJCQmrc3lzLnBhdGguZ2V0UGF0aE5hbWUoKbsgW2xhYmVsPSKrc3lzLm5hbWW7XG4oq3N5cy5uYW1luykiIHN0eWxlPWZpbGxlZCBjb2xvcj1yZWRdOwoJCQkJq0ZPUiBzc2kgOiBzeXMuaW5zdGFuY2VzuwoJCQkJCatzc2kucGF0aC5nZXRQYXRoTmFtZSgpuyBbbGFiZWw9Iqtzc2kubmFtZbtcbiirc3NpLnN1YlN5c3RlbUNsYXNzLm5hbWW7KSIgc3R5bGU9ZmlsbGVkIGNvbG9yPXllbGxvd107CgkJCQkJq3N5cy5wYXRoLmdldFBhdGhOYW1lKCm7IC0+IKtzc2kucGF0aC5nZXRQYXRoTmFtZSgpuzsgIAoJCQkJCatGT1IgYWkgOiBzc2kuaW5zdGFuY2VzuwoJCQkJCQmraW5zdGFuY2UoYWkpuwoJCQkJCatFTkRGT1K7CgkJCQmrRU5ERk9SuwoJCQl9CgkJJycnCgl9CgkKCWRlZiBwcml2YXRlIFN0cmluZyBpbnN0YW5jZShBYnN0cmFjdEluc3RhbmNlIGFpKSB7CgkJdmFsIHBhcmVudCA9IGFpLmVDb250YWluZXIgYXMgU3RydWN0dXJlSW5zdGFuY2UKCQl2YWwgcHRocmVhZCA9IEVUTWFwVXRpbDo6Z2V0TWFwcGVkVGhyZWFkKGFpKQoJCXZhbCB0bmFtZSA9IGlmIChwdGhyZWFkPT09bnVsbCkgIj8iIGVsc2UgcHRocmVhZC50aHJlYWQubmFtZQoJCXZhbCBub2RlID0gRVRNYXBVdGlsOjpnZXROb2RlUmVmKGFpKQoJCXZhbCBubmFtZSA9IGlmIChub2RlPT09bnVsbCkgIj8iIGVsc2Ugbm9kZS5uYW1lCgkJdmFsIG9wdGlvbmFsID0gaWYgKGFpIGluc3RhbmNlb2YgQWN0b3JJbnRlcmZhY2VJbnN0YW5jZSkgIm9wdGlvbmFsICIgZWxzZSAiIgoJCXZhbCBjbHNuYW1lID0gaWYgKGFpIGluc3RhbmNlb2YgQWN0b3JJbnN0YW5jZSkgKGFpIGFzIEFjdG9ySW5zdGFuY2UpLmFjdG9yQ2xhc3MubmFtZQoJCQllbHNlIGlmIChhaSBpbnN0YW5jZW9mIEFjdG9ySW50ZXJmYWNlSW5zdGFuY2UpIChhaSBhcyBBY3RvckludGVyZmFjZUluc3RhbmNlKS5hY3RvckNsYXNzLm5hbWUgZWxzZSAiPyIKCQkJCgkJJycnCgkJCathaS5wYXRoLmdldFBhdGhOYW1lKCm7IFtsYWJlbD0iq29wdGlvbmFsu6thaS5uYW1lu1xuKKtjbHNuYW1luylcbkCrbm5hbWW7Oqt0bmFtZbsiq0lGICFvcHRpb25hbC5lbXB0ebsgY29sb3I9Ymx1ZSBzdHlsZT1kYXNoZWSrRU5ESUa7XTsKCQkJq3BhcmVudC5wYXRoLmdldFBhdGhOYW1lKCm7IC0+IKthaS5wYXRoLmdldFBhdGhOYW1lKCm7OwoJCQmrSUYgYWkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVJbnN0YW5jZbsKCQkJCatGT1Igc3ViX2FpIDogKGFpIGFzIFN0cnVjdHVyZUluc3RhbmNlKS5pbnN0YW5jZXO7CgkJCQkJq2luc3RhbmNlKHN1Yl9haSm7CgkJCQmrRU5ERk9SuwoJCQmrRU5ESUa7IAoJCScnJwoJfQoKIAlkZWYgcHJpdmF0ZSBydW5Eb3QySnBnKFN0cmluZyBwYXRoLCBTdHJpbmcgYmF0KXsKIAkJdmFyIHdkaXIgPSBuZXcgRmlsZShwYXRoKQogCQl0cnkgewoJCQl2YWwgcCA9IGdldFJ1bnRpbWUuZXhlYygiY21kIC9DICIrYmF0LCBudWxsLCB3ZGlyKQoJCQlsb2dnZXIubG9nSW5mbyhiYXQrIiBmaW5pc2hlZCB3aXRoICIrcC53YWl0Rm9yKQoJCX0KCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKCQl9CgoJfQp9Cgk=