cGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklQcm9qZWN0TW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklSZXN0YXJ0YWJsZU1vZHVsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JU2VydmVyRGVsZWdhdGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkVjbGlwc2VVdGlsOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7CgovKioKICogQWN0aW9uIGRlbGVnYXRlIGZvciByZXN0YXJ0aW5nIGEgcHJvamVjdCB3aXRoaW4gYSBydW5uaW5nCiAqIHNlcnZlci4KICovCnB1YmxpYyBjbGFzcyBSZXN0YXJ0UHJvamVjdEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlIHsKCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwoKCS8qKgoJICogUmVzdGFydFByb2plY3RBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIFJlc3RhcnRQcm9qZWN0QWN0aW9uRGVsZWdhdGUoKSB7CgkJc3VwZXIoKTsKCX0KCQoJLyoqCgkgKiBQZXJmb3JtcyB0aGlzIGFjdGlvbi4KCSAqIDxwPgoJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIGRlbGVnYXRpbmcgYWN0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZC4KCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsuCgkgKiA8L3A+CgkgKgoJICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyB0aGUgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlCgkgKiAgIGFjdGlvbgoJICovCglwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewoJCQlwdWJsaWMgdm9pZCBydW4oKSB7CgkJCQlTaGVsbCBzaGVsbCA9IEVjbGlwc2VVdGlsLmdldFNoZWxsKCk7CgkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWRlZmF1bHREaWFsb2dUaXRsZSIpLCBudWxsLCBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWRpYWxvZ1Jlc3RhcnRpbmdQcm9qZWN0IiwgcHJvamVjdC5nZXROYW1lKCkpLCBNZXNzYWdlRGlhbG9nLklORk9STUFUSU9OLCBuZXcgU3RyaW5nWzBdLCAwKTsKCQkJCWRpYWxvZy5zZXRCbG9ja09uT3BlbihmYWxzZSk7CgkJCQlkaWFsb2cub3BlbigpOwoJCgkJCQlJUHJvamVjdE1vZHVsZSBtb2R1bGUgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZVByb2plY3QocHJvamVjdCk7CgkJCQlpZiAobW9kdWxlICE9IG51bGwpIHsKCQkJCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKG1vZHVsZSk7CgkJCQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewoJCQkJCQlpbnQgc2l6ZTIgPSBzZXJ2ZXJzLmxlbmd0aDsKCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7CgkJCQkJCQlieXRlIHN0YXRlID0gc2VydmVyc1tqXS5nZXRTZXJ2ZXJTdGF0ZSgpOwoJCQkJCQkJSVNlcnZlckRlbGVnYXRlIGRlbGVnYXRlID0gc2VydmVyc1tqXS5nZXREZWxlZ2F0ZSgpOwoJCQkJCQkJaWYgKChzdGF0ZSA9PSBJU2VydmVyLlNFUlZFUl9TVEFSVEVEIHx8IHN0YXRlID09IElTZXJ2ZXIuU0VSVkVSX1NUQVJURURfREVCVUcpICYmCgkJCQkJCQkJKGRlbGVnYXRlIGluc3RhbmNlb2YgSVJlc3RhcnRhYmxlTW9kdWxlKSkgewoJCQkJCQkJCUlSZXN0YXJ0YWJsZU1vZHVsZSByZXN0YXJ0YWJsZSA9IChJUmVzdGFydGFibGVNb2R1bGUpZGVsZWdhdGU7CgkJCQkJCQkJaWYgKHJlc3RhcnRhYmxlLmNhblJlc3RhcnRNb2R1bGUobW9kdWxlKSkgewoJCQkJCQkJCQl0cnkgewoJCQkJCQkJCQkJcmVzdGFydGFibGUucmVzdGFydE1vZHVsZShtb2R1bGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwoJCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJCQkJCQkJVHJhY2UudHJhY2UoIkVycm9yIHJlc3RhcnRpbmcgcHJvamVjdCIsIGUpOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJZGlhbG9nLmNsb3NlKCk7CgkJCX0KCQl9KTsKCX0KCQoJLyoqCgkgKiBOb3RpZmllcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZSB0aGF0IHRoZSBzZWxlY3Rpb24gaW4gdGhlIHdvcmtiZW5jaCBoYXMgY2hhbmdlZC4KCSAqIDxwPgoJICogSW1wbGVtZW50ZXJzIGNhbiB1c2UgdGhpcyBvcHBvcnR1bml0eSB0byBjaGFuZ2UgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUKCSAqIGFjdGlvbiBvciB0byBtb2RpZnkgb3RoZXIgcHJlc2VudGF0aW9uIHByb3BlcnRpZXMuCgkgKiA8L3A+CgkgKgoJICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUgYWN0aW9uCgkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoCgkgKi8KCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsKSB7CgkJaWYgKHNlbC5pc0VtcHR5KCkgfHwgIShzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwoJCQlyZXR1cm47CgkJfQoJCgkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWw7CgkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWxlY3QuaXRlcmF0b3IoKTsKCQlPYmplY3Qgc2VsZWN0aW9uID0gaXRlcmF0b3IubmV4dCgpOwoJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkgfHwgc2VsZWN0aW9uID09IG51bGwpIHsKCQkJLy8gbW9yZSB0aGFuIG9uZSBzZWxlY3Rpb24gKHNob3VsZCBuZXZlciBoYXBwZW4pCgkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKCQkJcmV0dXJuOwoJCX0KCQoJCWlmICghKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElQcm9qZWN0KSkgewoJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7CgkJCXJldHVybjsKCQl9CgkKCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBzZWxlY3Rpb247CgkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7CgkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKCQkJcmV0dXJuOwoJCX0KCQoJCUlQcm9qZWN0TW9kdWxlIG1vZHVsZSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlUHJvamVjdChwcm9qZWN0KTsKCQlpZiAobW9kdWxlICE9IG51bGwpIHsKCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShtb2R1bGUpOwoJCQlpZiAoc2VydmVycyAhPSBudWxsKSB7CgkJCQlpbnQgc2l6ZTIgPSBzZXJ2ZXJzLmxlbmd0aDsKCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewoJCQkJCWJ5dGUgc3RhdGUgPSBzZXJ2ZXJzW2pdLmdldFNlcnZlclN0YXRlKCk7CgkJCQkJSVNlcnZlckRlbGVnYXRlIGRlbGVnYXRlID0gc2VydmVyc1tqXS5nZXREZWxlZ2F0ZSgpOwoJCQkJCWlmICgoc3RhdGUgPT0gSVNlcnZlci5TRVJWRVJfU1RBUlRFRCB8fCBzdGF0ZSA9PSBJU2VydmVyLlNFUlZFUl9TVEFSVEVEX0RFQlVHKSAmJgoJCQkJCQkoZGVsZWdhdGUgaW5zdGFuY2VvZiBJUmVzdGFydGFibGVNb2R1bGUpKSB7CgkJCQkJCUlSZXN0YXJ0YWJsZU1vZHVsZSByZXN0YXJ0YWJsZSA9IChJUmVzdGFydGFibGVNb2R1bGUpZGVsZWdhdGU7CgkJCQkJCWlmIChyZXN0YXJ0YWJsZS5jYW5SZXN0YXJ0TW9kdWxlKG1vZHVsZSkpIHsKCQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Cgl9Cn0K