LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwovKioKICogUHVibGlzaCBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBtb2R1bGUgb24gYSBzcGVjaWZpYyBzZXJ2ZXIuCiAqLwpwdWJsaWMgY2xhc3MgTW9kdWxlUHVibGlzaEluZm8gewoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9JRCA9ICJtb2R1bGUtaWRzIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAicGF0aCI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTVAgPSAic3RhbXAiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEUgPSAiZmlsZSI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSID0gImZvbGRlciI7CgoJcHJpdmF0ZSBTdHJpbmcgbW9kdWxlSWQ7Cglwcml2YXRlIElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcyA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbMF07CgoJLyoqCgkgKiBNb2R1bGVQdWJsaXNoSW5mbyBjb25zdHJ1Y3Rvci4KCSAqIAoJICogQHBhcmFtIG1vZHVsZUlkIGEgbW9kdWxlIGlkCgkgKi8KCXB1YmxpYyBNb2R1bGVQdWJsaXNoSW5mbyhTdHJpbmcgbW9kdWxlSWQpIHsKCQlzdXBlcigpOwoKCQl0aGlzLm1vZHVsZUlkID0gbW9kdWxlSWQ7Cgl9CgkKCS8qKgoJICogTW9kdWxlUHVibGlzaEluZm8gY29uc3RydWN0b3IuCgkgKiAKCSAqIEBwYXJhbSBtZW1lbnRvIGEgbWVtZW50bwoJICovCglwdWJsaWMgTW9kdWxlUHVibGlzaEluZm8oSU1lbWVudG8gbWVtZW50bykgewoJCXN1cGVyKCk7CgkJCgkJbG9hZChtZW1lbnRvKTsKCX0KCQoJcHVibGljIFN0cmluZyBnZXRNb2R1bGVJZCgpIHsKCQlyZXR1cm4gbW9kdWxlSWQ7Cgl9CgkKCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoKSB7CgkJcmV0dXJuIHJlc291cmNlczsKCX0KCQoJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzKElNb2R1bGVSZXNvdXJjZVtdIHJlcykgewoJCXJlc291cmNlcyA9IHJlczsKCX0KCQoJLyoqCgkgKiAKCSAqLwoJcHJvdGVjdGVkIHZvaWQgbG9hZChJTWVtZW50byBtZW1lbnRvKSB7CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyBtb2R1bGUgcHVibGlzaCBpbmZvIGZvcjogIiArIG1lbWVudG8pOwoJCgkJdHJ5IHsKCQkJbW9kdWxlSWQgPSBtZW1lbnRvLmdldFN0cmluZyhNT0RVTEVfSUQpOwoJCgkJCXJlc291cmNlcyA9IGxvYWRSZXNvdXJjZShtZW1lbnRvKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgbW9kdWxlIHB1Ymxpc2ggaW5mbyBpbmZvcm1hdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKCQl9Cgl9CgkKCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBsb2FkUmVzb3VyY2UoSU1lbWVudG8gbWVtZW50bykgewoJCWlmIChtZW1lbnRvID09IG51bGwpCgkJCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlWzBdOwoJCQoJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoNSk7CgkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oRklMRSk7CgkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQlTdHJpbmcgbmFtZSA9IGNoaWxkcmVuW2ldLmdldFN0cmluZyhOQU1FKTsKCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChjaGlsZHJlbltpXS5nZXRTdHJpbmcoUEFUSCkpOwoJCQkJbG9uZyBzdGFtcCA9IExvbmcucGFyc2VMb25nKGNoaWxkcmVuW2ldLmdldFN0cmluZyhTVEFNUCkpOwoJCQkJTW9kdWxlRmlsZSBmaWxlID0gbmV3IE1vZHVsZUZpbGUobmFtZSwgcGF0aCwgc3RhbXApOwoJCQkJbGlzdC5hZGQoZmlsZSk7CgkJCX0KCQl9CgkJY2hpbGRyZW4gPSBtZW1lbnRvLmdldENoaWxkcmVuKEZPTERFUik7CgkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQlTdHJpbmcgbmFtZSA9IGNoaWxkcmVuW2ldLmdldFN0cmluZyhOQU1FKTsKCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChjaGlsZHJlbltpXS5nZXRTdHJpbmcoUEFUSCkpOwoJCQkJTW9kdWxlRm9sZGVyIGZvbGRlciA9IG5ldyBNb2R1bGVGb2xkZXIobmFtZSwgcGF0aCk7CgkJCQlmb2xkZXIuc2V0TWVtYmVycyhsb2FkUmVzb3VyY2UoY2hpbGRyZW5baV0pKTsKCQkJCWxpc3QuYWRkKGZvbGRlcik7CgkJCX0KCQl9CgkJCgkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMiA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbbGlzdC5zaXplKCldOwoJCWxpc3QudG9BcnJheShyZXNvdXJjZXMyKTsKCQlyZXR1cm4gcmVzb3VyY2VzOwoJfQoJCgkvKioKCSAqIAoJICovCglwcm90ZWN0ZWQgdm9pZCBzYXZlKElNZW1lbnRvIG1lbWVudG8pIHsKCQl0cnkgewoJCQltZW1lbnRvLnB1dFN0cmluZyhNT0RVTEVfSUQsIG1vZHVsZUlkKTsKCQkJCgkJCXNhdmVSZXNvdXJjZShtZW1lbnRvLCByZXNvdXJjZXMpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIG1vZHVsZSBwdWJsaXNoIGluZm8iLCBlKTsKCQl9Cgl9CgkKCXByb3RlY3RlZCB2b2lkIHNhdmVSZXNvdXJjZShJTWVtZW50byBtZW1lbnRvLCBJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMyKSB7CgkJaWYgKHJlc291cmNlczIgPT0gbnVsbCkKCQkJcmV0dXJuOwoJCWludCBzaXplID0gcmVzb3VyY2VzMi5sZW5ndGg7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJaWYgKHJlc291cmNlczJbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgewoJCQkJSU1vZHVsZUZpbGUgZmlsZSA9IChJTW9kdWxlRmlsZSkgcmVzb3VyY2VzMltpXTsKCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZChGSUxFKTsKCQkJCWNoaWxkLnB1dFN0cmluZyhOQU1FLCBmaWxlLmdldE5hbWUoKSk7CgkJCQljaGlsZC5wdXRTdHJpbmcoUEFUSCwgZmlsZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkpOwoJCQkJY2hpbGQucHV0U3RyaW5nKFNUQU1QLCAiIiArIGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSk7CgkJCX0gZWxzZSB7CgkJCQlJTW9kdWxlRm9sZGVyIGZvbGRlciA9IChJTW9kdWxlRm9sZGVyKSByZXNvdXJjZXMyW2ldOwoJCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKEZPTERFUik7CgkJCQljaGlsZC5wdXRTdHJpbmcoTkFNRSwgZm9sZGVyLmdldE5hbWUoKSk7CgkJCQljaGlsZC5wdXRTdHJpbmcoUEFUSCwgZm9sZGVyLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKSk7CgkJCQlJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMzID0gZm9sZGVyLm1lbWJlcnMoKTsKCQkJCXNhdmVSZXNvdXJjZShjaGlsZCwgcmVzb3VyY2VzMyk7CgkJCX0KCQl9Cgl9CgkKCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CgkJcmV0dXJuICJNb2R1bGVQdWJsaXNoSW5mbyBbIiArIG1vZHVsZUlkICsgIl0iOwoJfQp9