LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5EZWxldGVTZXJ2ZXJEaWFsb2c7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci8qKgogKiBBY3Rpb24gZm9yIGRlbGV0aW5nIHNlcnZlciByZXNvdXJjZXMuCiAqLwpwdWJsaWMgY2xhc3MgRGVsZXRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKCXByb3RlY3RlZCBMaXN0IGRlbGV0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Cglwcm90ZWN0ZWQgTGlzdCBkZWxldGVFeHRyYUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Cglwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7CgoJLyoqCgkgKiBEZWxldGVBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIERlbGV0ZUFjdGlvbihTaGVsbCBzaGVsbCwgT2JqZWN0IHNlcnZlclJlc291cmNlKSB7CgkJdGhpcyhzaGVsbCwgbmV3IE9iamVjdFtdIHsgc2VydmVyUmVzb3VyY2UgfSk7Cgl9CgoJLyoqCgkgKiBEZWxldGVBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIERlbGV0ZUFjdGlvbihTaGVsbCBzaGVsbCwgT2JqZWN0W10gc2VydmVyUmVzb3VyY2VzKSB7CgkJc3VwZXIoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVhY3Rpb25EZWxldGUiKSk7CgkJdGhpcy5zaGVsbCA9IHNoZWxsOwoJCQoJCWludCBzaXplID0gc2VydmVyUmVzb3VyY2VzLmxlbmd0aDsKCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQlkZWxldGVMaXN0LmFkZChzZXJ2ZXJSZXNvdXJjZXNbaV0pOwoJCX0KCQkKCQkvLyBUT0RPOiBkZWxldGUgc2VydmVyIGNvbmZpZwoJCS8qZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJaWYgKHNlcnZlclJlc291cmNlc1tpXSBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIHNlcnZlclJlc291cmNlc1tpXTsKCQkJfQoJCX0KCQkKCQkvLyByZW1vdmUgY29uZmlndXJhdGlvbnMgdGhhdCBhcmUgc3RpbGwgcmVmZXJlbmNlZAoJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CgkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewoJCQlpbnQgc2l6ZTIgPSBzZXJ2ZXJzLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7CgkJCQlpZiAoIWRlbGV0ZUxpc3QuY29udGFpbnMoc2VydmVyc1tpXSkpIHsKCQkJCQlJU2VydmVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBzZXJ2ZXJzW2ldLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKCQkJCQlpZiAoZGVsZXRlRXh0cmFMaXN0LmNvbnRhaW5zKGNvbmZpZykpCgkJCQkJCWRlbGV0ZUV4dHJhTGlzdC5yZW1vdmUoY29uZmlnKTsKCQkJCX0KCQkJfQoJCX0qLwoJfQoKCS8qKgoJICogSW52b2tlZCB3aGVuIGFuIGFjdGlvbiBvY2N1cnMuIAoJICovCglwdWJsaWMgdm9pZCBydW4oKSB7CgkJRGVsZXRlU2VydmVyRGlhbG9nIGRzZCA9IG5ldyBEZWxldGVTZXJ2ZXJEaWFsb2coc2hlbGwsIGRlbGV0ZUxpc3QsIGRlbGV0ZUV4dHJhTGlzdCk7CgkJZHNkLm9wZW4oKTsKCX0KfQ==