cGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5pbnRlcm5hbC5jb3JlOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwppbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CmltcG9ydCBqYXZhLm5ldC5VUkw7CmltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclN0YXRlOwovKioKICogVGhyZWFkIHVzZWQgdG8gcGluZyBzZXJ2ZXIgdG8gdGVzdCB3aGVuIGl0IGlzIHN0YXJ0ZWQuCiAqLwpwdWJsaWMgY2xhc3MgUGluZ1RocmVhZCBleHRlbmRzIFRocmVhZCB7CgkvLyBkZWxheSBiZWZvcmUgcGluZ2luZyBzdGFydHMKCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSU5HX0RFTEFZID0gMjAwMDsKCgkvLyBkZWxheSBiZXR3ZWVuIHBpbmdzCglwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19JTlRFUlZBTCA9IDI1MDsKCgkvLyBtYXhpbXVtIG51bWJlciBvZiBwaW5ncyBiZWZvcmUgZ2l2aW5nIHVwCglwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BJTkdTID0gNTY7IC8vIHRvdGFsOiAxNiBzZWNvbmRzCgoJcHJpdmF0ZSBib29sZWFuIHN0b3AgPSBmYWxzZTsKCXByaXZhdGUgU3RyaW5nIG1vZGU7Cglwcml2YXRlIFN0cmluZyB1cmwgPSAiIjsKCXByaXZhdGUgVG9tY2F0U2VydmVyIHNlcnZlclR5cGU7Cglwcml2YXRlIElTZXJ2ZXJTdGF0ZSBjb250cm9sOwoKCXB1YmxpYyBQaW5nVGhyZWFkKFRvbWNhdFNlcnZlciBzZXJ2ZXJUeXBlLCBJU2VydmVyU3RhdGUgY29udHJvbCwgU3RyaW5nIHVybCwgU3RyaW5nIG1vZGUpIHsJc3VwZXIoKTsKCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sOwoJCXRoaXMudXJsID0gdXJsOwoJCXRoaXMubW9kZSA9IG1vZGU7CgkJdGhpcy5zZXJ2ZXJUeXBlID0gc2VydmVyVHlwZTsKCQlzZXREYWVtb24odHJ1ZSk7Cgl9CgkKCS8qKgoJICogUGluZyB0aGUgc2VydmVyIHVudGlsIGl0IGlzIHN0YXJ0ZWQuIFRoZW4gc2V0IHRoZSBzZXJ2ZXIKCSAqIHN0YXRlIHRvIFNFUlZFUl9TVEFSVEVELgoJICovCglwdWJsaWMgdm9pZCBydW4oKSB7CgkJaW50IGNvdW50ID0gMDsKCQl0cnkgewoJCQlzbGVlcChQSU5HX0RFTEFZKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyB9CgkJd2hpbGUgKCFzdG9wKSB7CgkJCXRyeSB7CgkJCQlpZiAoY291bnQgPT0gTUFYX1BJTkdTKSB7CgkJCQkJc2VydmVyVHlwZS5zdG9wKCk7CgkJCQkJc3RvcCA9IHRydWU7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBwaW5naW5nIik7CgkJCQlVUkwgcGluZ1VybCA9IG5ldyBVUkwodXJsKTsKCQkJCVVSTENvbm5lY3Rpb24gY29ubiA9IHBpbmdVcmwub3BlbkNvbm5lY3Rpb24oKTsKCQkJCSgoSHR0cFVSTENvbm5lY3Rpb24pY29ubikuZ2V0UmVzcG9uc2VDb2RlKCk7CgkJCQljb3VudCsrOwoJCgkJCQkvLyBwaW5nIHdvcmtlZCAtIHNlcnZlciBpcyB1cAoJCQkJaWYgKCFzdG9wKSB7CgkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogc3VjY2VzcyIpOwoJCQkJCVRocmVhZC5zbGVlcCgyMDApOwoJCQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKCQkJCQkJY29udHJvbC5zZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNFUlZFUl9TVEFSVEVEX0RFQlVHKTsKCQkJCQllbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKQoJCQkJCQljb250cm9sLnNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU0VSVkVSX1NUQVJURURfUFJPRklMRSk7CgkJCQkJZWxzZQoJCQkJCQljb250cm9sLnNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU0VSVkVSX1NUQVJURUQpOwoJCQkJfQoJCQkJc3RvcCA9IHRydWU7CgkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmZSkgewoJCQkJdHJ5IHsgVGhyZWFkLnNsZWVwKDIwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IH0KCQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKCQkJCQljb250cm9sLnNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU0VSVkVSX1NUQVJURURfREVCVUcpOwoJCQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkKCQkJCQljb250cm9sLnNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU0VSVkVSX1NUQVJURURfUFJPRklMRSk7CgkJCQllbHNlCgkJCQkJY29udHJvbC5zZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNFUlZFUl9TVEFSVEVEKTsKCQkJCXN0b3AgPSB0cnVlOwoJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogZmFpbGVkIik7CgkJCQkvLyBwaW5naW5nIGZhaWxlZAoJCQkJaWYgKCFzdG9wKSB7CgkJCQkJdHJ5IHsKCQkJCQkJc2xlZXAoUElOR19JTlRFUlZBTCk7CgkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTIpIHsgfQoJCQkJfQoJCQl9CgkJfQoJfQoJCgkvKioKCSAqIFRlbGwgdGhlIHBpbmdpbmcgdG8gc3RvcC4KCSAqLwoJcHVibGljIHZvaWQgc3RvcFBpbmdpbmcoKSB7CgkJLy9UcmFjZS50cmFjZSgiUGluZzogc3RvcHBpbmciKTsKCQlzdG9wID0gdHJ1ZTsKCX0KfQ==