cGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcudHJlZTsKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKoCoKICogQ29udHJpYnV0b3JzOgogKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckNvbmZpZ3VyYXRpb247CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyTGFiZWxQcm92aWRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKCi8qKgogKgogKi8KcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Qcm94eVJlc291cmNlQWRhcHRlciBpbXBsZW1lbnRzIElBZGFwdGFibGUsIElXb3JrYmVuY2hBZGFwdGVyLCBJU2VydmVyRWxlbWVudFRhZyB7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBOT19DSElMRFJFTiA9IG5ldyBPYmplY3RbMF07CgkKCXB1YmxpYyBzdGF0aWMgSVNlcnZlckNvbmZpZ3VyYXRpb24gZGVsZXRlZDsKCglwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Cglwcm90ZWN0ZWQgT2JqZWN0IHBhcmVudDsKCglwdWJsaWMgQ29uZmlndXJhdGlvblByb3h5UmVzb3VyY2VBZGFwdGVyKE9iamVjdCBwYXJlbnQsIElTZXJ2ZXIgc2VydmVyKSB7CgkJc3VwZXIoKTsKCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKCX0KCgkvKgoJICogQHNlZSBJQWRhcHRhYmxlI2dldEFkYXB0ZXIoQ2xhc3MpCgkgKi8KCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7CgkJaWYgKGFkYXB0ZXIuZXF1YWxzKElBZGFwdGFibGUuY2xhc3MpKQoJCQlyZXR1cm4gdGhpczsKCQllbHNlIGlmIChhZGFwdGVyLmVxdWFscyhJV29ya2JlbmNoQWRhcHRlci5jbGFzcykpCgkJCXJldHVybiB0aGlzOwoJCWVsc2UKCQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKCX0KCQoJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7CgkJcmV0dXJuIE5PX0NISUxEUkVOOwoJfQoKCS8qCgkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldEltYWdlRGVzY3JpcHRvcihPYmplY3QpCgkgKi8KCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKCQlJU2VydmVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwoJCWlmIChjb25maWcgIT0gbnVsbCAmJiBjb25maWcgIT0gZGVsZXRlZCkKCQkJcmV0dXJuICgoU2VydmVyTGFiZWxQcm92aWRlcilTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpKS5nZXRJbWFnZURlc2NyaXB0b3IoY29uZmlnKTsKCQllbHNlCgkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19TRVJWRVJfQ09ORklHVVJBVElPTl9NSVNTSU5HKTsKCX0KCgkvKgoJICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRMYWJlbChPYmplY3QpCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKCQlJU2VydmVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwoJCWlmIChjb25maWcgIT0gbnVsbCAmJiBjb25maWcgIT0gZGVsZXRlZCkKCQkJcmV0dXJuIGNvbmZpZy5nZXROYW1lKCk7CgkJZWxzZQoJCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV2aWV3Tm9Db25maWd1cmF0aW9uIik7Cgl9CgoJLyoKCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0UGFyZW50KE9iamVjdCkKCSAqLwoJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKCQlyZXR1cm4gcGFyZW50OwoJfQoKCS8qKgoJICogUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdC4KCSAqIEByZXR1cm4gYm9vbGVhbgoJICogQHBhcmFtIG9iaiBqYXZhLmxhbmcuT2JqZWN0CgkgKi8KCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CgkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25Qcm94eVJlc291cmNlQWRhcHRlcikgewoJCQlDb25maWd1cmF0aW9uUHJveHlSZXNvdXJjZUFkYXB0ZXIgcHJveHkgPSAoQ29uZmlndXJhdGlvblByb3h5UmVzb3VyY2VBZGFwdGVyKSBvYmo7CgoJCQlJU2VydmVyIGluc3QgPSBwcm94eS5nZXRTZXJ2ZXIoKTsKCQkJaWYgKChzZXJ2ZXIgPT0gbnVsbCAmJiBpbnN0ICE9IG51bGwpIHx8CgkJCQlzZXJ2ZXIgIT0gbnVsbCAmJiAhc2VydmVyLmVxdWFscyhpbnN0KSkKCQkJCXJldHVybiBmYWxzZTsKCQoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoJCgkvKioKCSAqIFJldHVybiB0aGUgc2VydmVyLgoJICoKCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklTZXJ2ZXIKCSAqLwoJcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewoJCXJldHVybiBzZXJ2ZXI7Cgl9CgkKCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CgkJaWYgKHNlcnZlciAhPSBudWxsKSB7CgkJCUlGaWxlIGZpbGUgPSBzZXJ2ZXIuZ2V0RmlsZSgpOwoJCQlyZXR1cm4gZmlsZS5oYXNoQ29kZSgpOwoJCX0gZWxzZQoJCQlyZXR1cm4gMDsKCX0KfQo=