LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBOYWNpIE0uIERhaSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAgICAgCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWw7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5sYXVuY2hpbmcuUnVudGltZUNsYXNzcGF0aEVudHJ5OwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKCi8qKgogKiBAYXV0aG9yIE5hY2kgRGFpCiAqCiAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwogKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKICovCnB1YmxpYyBjbGFzcyBTZXJ2ZXJBZG1pblRvb2wgewoJZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTk9ORSA9IDA7CglmaW5hbCBwdWJsaWMgc3RhdGljIGludCBXRUIgPSAxOwoJZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUpCID0gMjsKCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVBUiA9IDM7CgoJZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgTk9UREVGSU5FRCA9ICI8Tk9UIERFRklORUQ+IjsKCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRklORUQgPSAiPERFRklORUQ+IjsKCXByaXZhdGUgU3RyaW5nIG1haW5DbGFzczsKCglwdWJsaWMgY2xhc3MgTW9kdWxlIHsKCgkJcHJpdmF0ZSBpbnQgdHlwZSA9IC0xOwoJCXByaXZhdGUgU3RyaW5nIGRlcGxveSA9ICIiOwoJCXByaXZhdGUgU3RyaW5nIHVuZGVwbG95ID0gIiI7CgkJcHJpdmF0ZSBNb2R1bGUgd2ViTW9kdWxlcyA9IG51bGw7CgkJcHJpdmF0ZSBNb2R1bGUgZWpiTW9kdWxlcyA9IG51bGw7CgkJLyoqCgkJICogQHJldHVybgoJCSAqLwoJCXB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95KCkgewoJCQlyZXR1cm4gZGVwbG95OwoJCX0KCgkJLyoqCgkJICogQHJldHVybgoJCSAqLwoJCXB1YmxpYyBNb2R1bGUgZ2V0RWpiTW9kdWxlcygpIHsKCQkJcmV0dXJuIGVqYk1vZHVsZXM7CgkJfQoKCQkvKioKCQkgKiBAcmV0dXJuCgkJICovCgkJcHVibGljIGludCBnZXRUeXBlKCkgewoJCQlyZXR1cm4gdHlwZTsKCQl9CgoJCS8qKgoJCSAqIEByZXR1cm4KCQkgKi8KCQlwdWJsaWMgU3RyaW5nIGdldFVuZGVwbG95KCkgewoJCQlyZXR1cm4gdW5kZXBsb3k7CgkJfQoKCQkvKioKCQkgKiBAcmV0dXJuCgkJICovCgkJcHVibGljIE1vZHVsZSBnZXRXZWJNb2R1bGVzKCkgewoJCQlyZXR1cm4gd2ViTW9kdWxlczsKCQl9CgoJCS8qKgoJCSAqIEBwYXJhbSBzdHJpbmcKCQkgKi8KCQlwdWJsaWMgdm9pZCBzZXREZXBsb3koU3RyaW5nIHN0cmluZykgewoJCQlpZiAoc3RyaW5nID09IG51bGwpCgkJCQlkZXBsb3kgPSAiIjsKCQkJZWxzZQoJCQkJZGVwbG95ID0gc3RyaW5nOwoJCX0KCgkJLyoqCgkJICogQHBhcmFtIHN0cmluZwoJCSAqLwoJCXB1YmxpYyB2b2lkIHNldEVqYk1vZHVsZXMoTW9kdWxlIG1vZCkgewoJCQllamJNb2R1bGVzID0gbW9kOwoJCX0KCgkJLyoqCgkJICogQHBhcmFtIGkKCQkgKi8KCQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCBpKSB7CgkJCXR5cGUgPSBpOwoJCX0KCgkJLyoqCgkJICogQHBhcmFtIHN0cmluZwoJCSAqLwoJCXB1YmxpYyB2b2lkIHNldFVuZGVwbG95KFN0cmluZyBzdHJpbmcpIHsKCQkJaWYgKHN0cmluZyA9PSBudWxsKQoJCQkJdW5kZXBsb3kgPSAiIjsKCQkJZWxzZQoJCQkJdW5kZXBsb3kgPSBzdHJpbmc7CgkJfQoKCQkvKioKCQkgKiBAcGFyYW0gc3RyaW5nCgkJICovCgkJcHVibGljIHZvaWQgc2V0V2ViTW9kdWxlcyhNb2R1bGUgbW9kKSB7CgkJCXdlYk1vZHVsZXMgPSBtb2Q7CgkJfQoKCX0KCglwcml2YXRlIE1vZHVsZSB3ZWI7Cglwcml2YXRlIE1vZHVsZSBlamI7Cglwcml2YXRlIE1vZHVsZSBlYXI7Cglwcml2YXRlIGJvb2xlYW4gZGVmaW5lZCA9IGZhbHNlOwoKCXByaXZhdGUgQXJyYXlMaXN0IHRvb2xDbGFzc1BhdGg7Cglwcml2YXRlIFNlcnZlclR5cGVEZWZpbml0aW9uIGRlZmluaXRpb247CgoJcHVibGljIFNlcnZlckFkbWluVG9vbChTZXJ2ZXJUeXBlRGVmaW5pdGlvbiBkZWYpIHsKCQltYWluQ2xhc3MgPSBOT1RERUZJTkVEOwoJCWRlZmluaXRpb24gPSBkZWY7CgkJdG9vbENsYXNzUGF0aCA9IG5ldyBBcnJheUxpc3QoKTsKCQl3ZWIgPSBuZXcgTW9kdWxlKCk7CgkJd2ViLnNldFR5cGUoV0VCKTsKCQllamIgPSBuZXcgTW9kdWxlKCk7CgkJZWpiLnNldFR5cGUoRUpCKTsKCQllYXIgPSBuZXcgTW9kdWxlKCk7CgkJZWFyLnNldFR5cGUoRUpCKTsKCQllYXIuc2V0V2ViTW9kdWxlcyhuZXcgTW9kdWxlKCkpOwoJCWVhci5zZXRFamJNb2R1bGVzKG5ldyBNb2R1bGUoKSk7CgoJfQoKCXB1YmxpYyB2b2lkIGFkZFNlcnZlckNsYXNzcGF0aChDbGFzc3BhdGhJdGVtIGNsYXNzcGF0aEl0ZW0pIHsKCQl0aGlzLmdldFRvb2xDbGFzc1BhdGgoKS5hZGQoY2xhc3NwYXRoSXRlbSk7Cgl9CgoJLyogKG5vbi1KYXZhZG9jKQoJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKCSAqLwoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlTdHJpbmcgeG1sID0gIiI7CgkJeG1sCgkJCSs9ICgiXG48YWRtaW5Ub29sPiIKCQkJCSsgIlxuXHQ8d2ViPiIKCQkJCSsgKHRoaXMuZ2V0V2ViKCkuZ2V0RGVwbG95KCkubGVuZ3RoKCkgPiAwCgkJCQkJPyAiXG5cdFx0PGRlcGxveT48IVtDREFUQVsiCgkJCQkJCSsgdGhpcy5nZXRXZWIoKS5nZXREZXBsb3koKQoJCQkJCQkrICJdXT48L2RlcGxveT4iCgkJCQkJOiAiPGRlcGxveSAvPiIpCgkJCQkrICh0aGlzLmdldFdlYigpLmdldFVuZGVwbG95KCkubGVuZ3RoKCkgPiAwCgkJCQkJPyAiXG5cdFx0PHVuZGVwbG95PjwhW0NEQVRBWyIKCQkJCQkJKyB0aGlzLmdldFdlYigpLmdldFVuZGVwbG95KCkKCQkJCQkJKyAiXV0+PC91bmRlcGxveT4iCgkJCQkJOiAiPHVuZGVwbG95IC8+IikKCQkJCSsgIlxuXHQ8L3dlYj4iCgkJCQkrICJcblx0PGVqYj4iCgkJCQkrICh0aGlzLmdldEVqYigpLmdldERlcGxveSgpLmxlbmd0aCgpID4gMAoJCQkJCT8gIlxuXHRcdDxkZXBsb3k+PCFbQ0RBVEFbIgoJCQkJCQkrIHRoaXMuZ2V0RWpiKCkuZ2V0RGVwbG95KCkKCQkJCQkJKyAiXV0+PC9kZXBsb3k+IgoJCQkJCTogIjxkZXBsb3kgLz4iKQoJCQkJKyAodGhpcy5nZXRFamIoKS5nZXRVbmRlcGxveSgpLmxlbmd0aCgpID4gMAoJCQkJCT8gIlxuXHRcdDx1bmRlcGxveT48IVtDREFUQVsiCgkJCQkJCSsgdGhpcy5nZXRFamIoKS5nZXRVbmRlcGxveSgpCgkJCQkJCSsgIl1dPjwvdW5kZXBsb3k+IgoJCQkJCTogIjx1bmRlcGxveSAvPiIpCgkJCQkrICJcblx0PC9lamI+IgoJCQkJKyAiXG5cdDxlYXI+IgoJCQkJKyAodGhpcy5nZXRFYXIoKS5nZXREZXBsb3koKS5sZW5ndGgoKSA+IDAKCQkJCQk/ICJcblx0XHQ8ZGVwbG95PjwhW0NEQVRBWyIKCQkJCQkJKyB0aGlzLmdldEVhcigpLmdldERlcGxveSgpCgkJCQkJCSsgIl1dPjwvZGVwbG95PiIKCQkJCQk6ICI8ZGVwbG95IC8+IikKCQkJCSsgKHRoaXMuZ2V0RWFyKCkuZ2V0VW5kZXBsb3koKS5sZW5ndGgoKSA+IDAKCQkJCQk/ICJcblx0XHQ8dW5kZXBsb3k+PCFbQ0RBVEFbIgoJCQkJCQkrIHRoaXMuZ2V0RWFyKCkuZ2V0VW5kZXBsb3koKQoJCQkJCQkrICJdXT48L3VuZGVwbG95PiIKCQkJCQk6ICI8dW5kZXBsb3kgLz4iKQoJCQkJKyAiXG5cdFx0PHdlYk1vZHVsZT4iCgkJCQkrICh0aGlzLmdldEVhcigpLmdldFdlYk1vZHVsZXMoKS5nZXREZXBsb3koKS5sZW5ndGgoKSA+IDAKCQkJCQk/ICJcblx0XHRcdDxkZXBsb3k+PCFbQ0RBVEFbIgoJCQkJCQkrIHRoaXMuZ2V0RWFyKCkuZ2V0V2ViTW9kdWxlcygpLmdldERlcGxveSgpCgkJCQkJCSsgIl1dPjwvZGVwbG95PiIKCQkJCQk6ICI8ZGVwbG95IC8+IikKCQkJCSsgKHRoaXMuZ2V0RWFyKCkuZ2V0V2ViTW9kdWxlcygpLmdldFVuZGVwbG95KCkubGVuZ3RoKCkgPiAwCgkJCQkJPyAiXG5cdFx0XHQ8dW5kZXBsb3k+PCFbQ0RBVEFbIgoJCQkJCQkrIHRoaXMuZ2V0RWFyKCkuZ2V0V2ViTW9kdWxlcygpLmdldFVuZGVwbG95KCkKCQkJCQkJKyAiXV0+PC91bmRlcGxveT4iCgkJCQkJOiAiPHVuZGVwbG95IC8+IikKCQkJCSsgIlxuXHRcdDwvd2ViTW9kdWxlPiIKCQkJCSsgIlxuXHRcdDxlamJNb2R1bGU+IgoJCQkJKyAodGhpcy5nZXRFYXIoKS5nZXRFamJNb2R1bGVzKCkuZ2V0RGVwbG95KCkubGVuZ3RoKCkgPiAwCgkJCQkJPyAiXG5cdFx0XHQ8ZGVwbG95PjwhW0NEQVRBWyIKCQkJCQkJKyB0aGlzLmdldEVhcigpLmdldEVqYk1vZHVsZXMoKS5nZXREZXBsb3koKQoJCQkJCQkrICJdXT48L2RlcGxveT4iCgkJCQkJOiAiPGRlcGxveSAvPiIpCgkJCQkrICh0aGlzLmdldEVhcigpLmdldEVqYk1vZHVsZXMoKS5nZXRVbmRlcGxveSgpLmxlbmd0aCgpID4gMAoJCQkJCT8gIlxuXHRcdFx0PHVuZGVwbG95PjwhW0NEQVRBWyIKCQkJCQkJKyB0aGlzLmdldEVhcigpLmdldEVqYk1vZHVsZXMoKS5nZXRVbmRlcGxveSgpCgkJCQkJCSsgIl1dPjwvdW5kZXBsb3k+IgoJCQkJCTogIjx1bmRlcGxveSAvPiIpCgkJCQkrICJcblx0XHQ8L2VqYk1vZHVsZT4iCgkJCQkrICJcblx0PC9lYXI+IgoJCQkJKyAiXG48L2FkbWluVG9vbD4iKTsKCgkJeG1sICs9ICJcbjxhZG1pblRvb2xQYXRoPiI7CgkJSXRlcmF0b3IgcHJvcHMgPSB0aGlzLmdldFRvb2xDbGFzc1BhdGgoKS5pdGVyYXRvcigpOwoJCXdoaWxlIChwcm9wcy5oYXNOZXh0KCkpIHsKCQkJeG1sICs9ICJcblx0IiArIHByb3BzLm5leHQoKS50b1N0cmluZygpOwoJCX0KCQl4bWwgKz0gIlxuPC9hZG1pblRvb2xQYXRoPiI7CgoJCXJldHVybiB4bWw7CgoJfQoKCS8qKgoJICogQHJldHVybgoJICovCglwdWJsaWMgYm9vbGVhbiBpc0RlZmluZWQoKSB7CgkJcmV0dXJuIGRlZmluZWQ7Cgl9CgoJcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBwcm9qKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CgkJSXRlcmF0b3IgaXRlciA9IHRoaXMuZ2V0VG9vbENsYXNzUGF0aCgpLml0ZXJhdG9yKCk7CgkJQXJyYXlMaXN0IG5ld1BhdGggPSBuZXcgQXJyYXlMaXN0KCk7CgkJU3RyaW5nIGNwID0gIiI7CgkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CgkJCUNsYXNzcGF0aEl0ZW0gZWxlbWVudCA9IChDbGFzc3BhdGhJdGVtKSBpdGVyLm5leHQoKTsKCQkJU3RyaW5nIGxpYiA9CgkJCQl0aGlzLmRlZmluaXRpb24ucmVzb2x2ZVByb3BlcnRpZXMoZWxlbWVudC5nZXRDbGFzc3BhdGgoKSk7CgkJCXN3aXRjaCAoZWxlbWVudC5nZXRUeXBlKCkpIHsKCQkJCWNhc2UgQ2xhc3NwYXRoSXRlbS5WQVJJQUJMRSA6CgkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0KCQkJCQkJSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShuZXcgUGF0aChsaWIpLCBudWxsLCBudWxsKTsKCQkJCQlSdW50aW1lQ2xhc3NwYXRoRW50cnkgcmVudHJ5ID0KCQkJCQkJbmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeShlbnRyeSk7CgkJCQkJbmV3UGF0aC5hZGQocmVudHJ5KTsKCQkJCQlicmVhazsKCgkJCQlkZWZhdWx0IDoKCQkJCQlJQ2xhc3NwYXRoRW50cnkgbGVudHJ5ID0KCQkJCQkJSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKGxpYiksIG51bGwsIG51bGwpOwoJCQkJCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBscmVudHJ5ID0KCQkJCQkJbmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeShsZW50cnkpOwoJCQkJCW5ld1BhdGguYWRkKGxyZW50cnkpOwoJCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gcmVzdWx0TGlzdCA9CgkJCShJUnVudGltZUNsYXNzcGF0aEVudHJ5W10pIG5ld1BhdGgudG9BcnJheSgKCQkJCW5ldyBJUnVudGltZUNsYXNzcGF0aEVudHJ5W25ld1BhdGguc2l6ZSgpXSk7CgkJLy8gMS4gcmVtb3ZlIGJvb3RwYXRoIGVudHJpZXMKCQkvLyAyLiByZXNvbHZlICYgdHJhbnNsYXRlIHRvIGxvY2FsIGZpbGUgc3lzdGVtIHBhdGhzCgkJTGlzdCByZXNvbHZlZCA9IG5ldyBBcnJheUxpc3QocmVzdWx0TGlzdC5sZW5ndGgpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGlzdC5sZW5ndGg7IGkrKykgewoJCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gcmVzdWx0TGlzdFtpXTsKCQkJaWYgKGVudHJ5LmdldENsYXNzcGF0aFByb3BlcnR5KCkKCQkJCT09IElSdW50aW1lQ2xhc3NwYXRoRW50cnkuVVNFUl9DTEFTU0VTKSB7CgkJCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9CgkJCQkJSmF2YVJ1bnRpbWUucmVzb2x2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShlbnRyeSwgcHJvaik7CgkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspIHsKCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBlbnRyaWVzW2pdLmdldExvY2F0aW9uKCk7CgkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKCQkJCQkJcmVzb2x2ZWQuYWRkKGxvY2F0aW9uKTsKCQkJCQkJY3AgKz0gbG9jYXRpb24gKyBGaWxlLnBhdGhTZXBhcmF0b3I7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCS8vcmV0dXJuIChTdHJpbmdbXSlyZXNvbHZlZC50b0FycmF5KG5ldyBTdHJpbmdbcmVzb2x2ZWQuc2l6ZSgpXSk7CgkJcmV0dXJuIGNwOwoKCX0KCgkvKioKCSAqIEByZXR1cm4KCSAqLwoJcHVibGljIFNlcnZlclR5cGVEZWZpbml0aW9uIGdldERlZmluaXRpb24oKSB7CgkJcmV0dXJuIGRlZmluaXRpb247Cgl9CgoJLyoqCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBNb2R1bGUgZ2V0RWFyKCkgewoJCXJldHVybiBlYXI7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBNb2R1bGUgZ2V0RWpiKCkgewoJCXJldHVybiBlamI7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkNsYXNzKCkgewoJCXJldHVybiBtYWluQ2xhc3M7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBBcnJheUxpc3QgZ2V0VG9vbENsYXNzUGF0aCgpIHsKCQlyZXR1cm4gdG9vbENsYXNzUGF0aDsKCX0KCgkvKioKCSAqIEByZXR1cm4KCSAqLwoJcHVibGljIE1vZHVsZSBnZXRXZWIoKSB7CgkJcmV0dXJuIHdlYjsKCX0KCgkvKioKCSAqIEBwYXJhbSBkZWZpbml0aW9uCgkgKi8KCXB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oU2VydmVyVHlwZURlZmluaXRpb24gZGVmaW5pdGlvbikgewoJCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Cgl9CgoJLyoqCgkgKiBAcGFyYW0gbW9kdWxlCgkgKi8KCXB1YmxpYyB2b2lkIHNldEVhcihNb2R1bGUgbW9kdWxlKSB7CgkJZWFyID0gbW9kdWxlOwoJfQoKCS8qKgoJICogQHBhcmFtIG1vZHVsZQoJICovCglwdWJsaWMgdm9pZCBzZXRFamIoTW9kdWxlIG1vZHVsZSkgewoJCWVqYiA9IG1vZHVsZTsKCX0KCgkvKioKCSAqIEBwYXJhbSBzdHJpbmcKCSAqLwoJcHVibGljIHZvaWQgc2V0TWFpbkNsYXNzKFN0cmluZyBzdHJpbmcpIHsKCQltYWluQ2xhc3MgPSBzdHJpbmc7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gbGlzdAoJICovCglwdWJsaWMgdm9pZCBzZXRUb29sQ2xhc3NQYXRoKEFycmF5TGlzdCBsaXN0KSB7CgkJdG9vbENsYXNzUGF0aCA9IGxpc3Q7Cgl9CgoJLyoqCgkgKiBAcGFyYW0gbW9kdWxlCgkgKi8KCXB1YmxpYyB2b2lkIHNldFdlYihNb2R1bGUgbW9kdWxlKSB7CgkJd2ViID0gbW9kdWxlOwoJfQoKCS8qKgoJICogQHBhcmFtIGIKCSAqLwoJcHVibGljIHZvaWQgc2V0RGVmaW5lZChib29sZWFuIGIpIHsKCQlkZWZpbmVkID0gYjsKCX0KCn0K