LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7CgppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKCmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLyoqCiAqIEEgaGVscGVyIGNsYXNzIHVzZWQgdG8gY2FjaGUgdGhlIGNyZWF0aW9uIG9mIHNlcnZlciBlbGVtZW50cy4KICovCnB1YmxpYyBjbGFzcyBFbGVtZW50Q3JlYXRpb25DYWNoZSB7Cglwcm90ZWN0ZWQgTWFwIGVsZW1lbnRDYWNoZTsKCXByb3RlY3RlZCBNYXAgdGFza0NhY2hlOwoKCS8qKgoJICogRWxlbWVudENyZWF0aW9uQ2FjaGUgY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIEVsZW1lbnRDcmVhdGlvbkNhY2hlKCkgewoJCXN1cGVyKCk7CgkJZWxlbWVudENhY2hlID0gbmV3IEhhc2hNYXAoKTsKCQl0YXNrQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwoJfQoJCgkvKioKCSAqIFJldHVybiB0aGUga2V5IHRvIHVzZSBmb3IgdGhlIGdpdmVuIGZhY3RvcnkuCgkgKgoJICogQHBhcmFtIGZhY3RvcnkKCSAqIEByZXR1cm4KCSAqLwoJcHJvdGVjdGVkIFN0cmluZyBnZXRLZXkoSVNlcnZlclR5cGUgdHlwZSwgU3RyaW5nIGhvc3QpIHsKCQlyZXR1cm4gdHlwZS5nZXRJZCgpICsgInwiICsgaG9zdCArICJ8IjsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBzZXJ2ZXIuIAoJICoKCSAqIEBwYXJhbSB0eXBlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZQoJICogQHJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5CgkgKi8KCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKElTZXJ2ZXJUeXBlIHR5cGUsIFN0cmluZyBob3N0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKCQl0cnkgewoJCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gZ2V0Q2FjaGVkU2VydmVyKHR5cGUsIGhvc3QpOwoJCQlpZiAoc2VydmVyICE9IG51bGwpCgkJCQlyZXR1cm4gc2VydmVyOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCS8vIGlnbm9yZQoJCX0KCQoJCXRyeSB7CgkJCUlGaWxlIGZpbGUgPSBudWxsOwoJCQlpZiAoU2VydmVyQ29yZS5nZXRTZXJ2ZXJQcmVmZXJlbmNlcygpLmlzQ3JlYXRlUmVzb3VyY2VzSW5Xb3Jrc3BhY2UoKSkKCQkJCWZpbGUgPSBTZXJ2ZXJVdGlsLmdldFVudXNlZFNlcnZlckZpbGUoV2l6YXJkVXRpbC5nZXRTZXJ2ZXJQcm9qZWN0KCksIHR5cGUpOwoJCQkKCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IHR5cGUuY3JlYXRlU2VydmVyKG51bGwsIGZpbGUsIChJUnVudGltZSludWxsLCBtb25pdG9yKTsKCQkJZWxlbWVudENhY2hlLnB1dChnZXRLZXkodHlwZSwgaG9zdCksIHNlcnZlcik7CgkJCXJldHVybiBzZXJ2ZXI7CgkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewoJCQl0aHJvdyBjZTsKCQl9Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgY2FjaGVkIHNlcnZlciByZXNvdXJjZS4gCgkgKgoJICogQHBhcmFtIGZhY3Rvcnkgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklTZXJ2ZXJGYWN0b3J5CgkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JU2VydmVyUmVzb3VyY2UKCSAqLwoJcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRDYWNoZWRTZXJ2ZXIoSVNlcnZlclR5cGUgdHlwZSwgU3RyaW5nIGhvc3QpIHsKCQl0cnkgewoJCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgZWxlbWVudENhY2hlLmdldChnZXRLZXkodHlwZSwgaG9zdCkpOwoJCQlpZiAoc2VydmVyICE9IG51bGwpCgkJCQlyZXR1cm4gc2VydmVyOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCS8vIGlnbm9yZQoJCX0KCgkJcmV0dXJuIG51bGw7Cgl9Cn0=