LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICAgIE5hY2kgTS4gRGFpCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC51aTsKCgppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS5HZW5lcmljU2VydmVyUnVudGltZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWwuU2VydmVyVHlwZURlZmluaXRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklFbGVtZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSZXNvdXJjZU1hbmFnZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVRhc2tNb2RlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKCi8qKgogKiBBIHNlcnZlckRlZmluaXRpb25UeXBlIGF3YXJlIHdpemFyZCBmb3IgZGVmaW5pbmcgcnVudGltZXMuCiAqIAogKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgogKi8KcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBTZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQgewoJCglwcml2YXRlIEdyb3VwIHNlbGVjdGlvbkJhcjsKCXByaXZhdGUgQ29tYm8gZlNlcnZlckNvbWJvOwoJcHJpdmF0ZSBTZXJ2ZXJUeXBlRGVmaW5pdGlvbkdyb3VwIGZTZXJ2ZXJQYW5lbDsKCXByaXZhdGUgSVJ1bnRpbWVXb3JraW5nQ29weSBmUnVudGltZVdDOwoJCgkvKioKCSAqIENvbnN0cnVjdG9yCgkgKi8KCXB1YmxpYyBHZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50KCkgewoJCXN1cGVyKCk7Cgl9CgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIGNvbS5pYm0ud3RwLnNlcnZlci51aS53aXphcmQuSVdpemFyZEZyYWdtZW50I2lzQ29tcGxldGUoKQoJICovCglwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewoJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwoJCWlmIChydW50aW1lID09IG51bGwpCgkJCXJldHVybiBmYWxzZTsKCQlJU3RhdHVzIHN0YXR1cyA9IHJ1bnRpbWUudmFsaWRhdGUoKTsKCQlyZXR1cm4gKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5pc09LKCkpOwoJfQoJCglwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgaGFuZGxlKSB7CgkJZlJ1bnRpbWVXQz1udWxsOwoJCWNyZWF0ZVNlbGVjdGlvbkJhcihwYXJlbnQpOwoJCWNyZWF0ZVNlcnZlckRlZmluaXRpb25UeXBlQ29tcG9zaXRlKHBhcmVudCk7Cgl9CgoJCglwcml2YXRlIHZvaWQgc3dhcEJvZHkoKSAKCXsKICAgICAgICBTdHJpbmcgc2VsZWN0ZWQgPSBmU2VydmVyQ29tYm8gPT0gbnVsbCA/IG51bGwgOiBmU2VydmVyQ29tYm8KICAgICAgICAgICAgICAgIC5nZXRJdGVtKGZTZXJ2ZXJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKICAgICAgICBpZiAoZ2V0U2VydmVyRGVmaW5pdGlvbklkKCkgIT0gbnVsbCkKICAgICAgICAgICAgc2VsZWN0ZWQgPSBnZXRTZXJ2ZXJEZWZpbml0aW9uSWQoKTsKICAgICAgICBNYXAgcHJvcGVydGllcyA9IG51bGw7CiAgICAgICAgaWYgKGdldFJ1bnRpbWVXb3JraW5nQ29weSgpICE9IG51bGwpCiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBnZXRSdW50aW1lV29ya2luZ0NvcHkoKQogICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljU2VydmVyUnVudGltZS5TRVJWRVJfSU5TVEFOQ0VfUFJPUEVSVElFUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXApIG51bGwpOwogICAgICAgIFNlcnZlclR5cGVEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihzZWxlY3RlZCwKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMpOwoKICAgICAgICBmU2VydmVyUGFuZWwucmVzZXQoZGVmaW5pdGlvbiwKICAgICAgICAgICAgICAgIFNlcnZlclR5cGVEZWZpbml0aW9uR3JvdXAuQ09OVEVYVF9SVU5USU1FLCBwcm9wZXJ0aWVzKTsKICAgIH0KCS8qKgogICAgICogQHBhcmFtIHNlbGVjdGVkCiAgICAgKi8KICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTZXJ2ZXJEZWZpbml0aW9uVHlwZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7ICAgICAKICAgICAgICBTdHJpbmcgc2VsZWN0ZWQgPSBmU2VydmVyQ29tYm89PW51bGw/bnVsbDpmU2VydmVyQ29tYm8uZ2V0SXRlbShmU2VydmVyQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7CiAgICAgICAgaWYoZ2V0U2VydmVyRGVmaW5pdGlvbklkKCkhPW51bGwpCgkJICAgIHNlbGVjdGVkPWdldFNlcnZlckRlZmluaXRpb25JZCgpOwogICAgICAgIE1hcCBwcm9wZXJ0aWVzPSBudWxsOwogICAgICAgIGlmKGdldFJ1bnRpbWVXb3JraW5nQ29weSgpIT1udWxsKQogICAgICAgICAgICBwcm9wZXJ0aWVzID0gZ2V0UnVudGltZVdvcmtpbmdDb3B5KCkuZ2V0QXR0cmlidXRlKEdlbmVyaWNTZXJ2ZXJSdW50aW1lLlNFUlZFUl9JTlNUQU5DRV9QUk9QRVJUSUVTLChNYXApbnVsbCk7CgkJU2VydmVyVHlwZURlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldFNlcnZlclR5cGVEZWZpbml0aW9uKHNlbGVjdGVkLHByb3BlcnRpZXMpOwogICAgICAgIGZTZXJ2ZXJQYW5lbCA9IG5ldyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbkdyb3VwKGRlZmluaXRpb24sU2VydmVyVHlwZURlZmluaXRpb25Hcm91cC5DT05URVhUX1JVTlRJTUUscHJvcGVydGllcyxwYXJlbnQsU1dULk5PTkUpOwogICAgfQogICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlbGVjdGlvbkJhcihDb21wb3NpdGUgY29udGVudCkgewoJCXNlbGVjdGlvbkJhciA9IG5ldyBHcm91cChjb250ZW50LCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7CgkJc2VsZWN0aW9uQmFyLnNldExheW91dChuZXcgR3JpZExheW91dCgyLGZhbHNlKSk7CgkJc2VsZWN0aW9uQmFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwoJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNlbGVjdGlvbkJhciwgU1dULk5PTkUpOwoJCWxhYmVsLnNldFRleHQoIlNlcnZlciB0eXBlczoiKTsKCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKCQlmU2VydmVyQ29tYm8gPSBuZXcgQ29tYm8oc2VsZWN0aW9uQmFyLCBTV1QuQk9SREVSIHxTV1QuUkVBRF9PTkxZKTsKCQlTZXJ2ZXJUeXBlRGVmaW5pdGlvbltdIHNlcnZlcnMgPSBnZXRBbGxTZXJ2ZXJEZWZpbml0aW9uVHlwZXMoKTsKCQlmb3IoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKXsKCQkJZlNlcnZlckNvbWJvLmFkZChzZXJ2ZXJzW2ldLmdldE5hbWUoKSk7CgkJfQoJCWZTZXJ2ZXJDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKCQlpZihmU2VydmVyQ29tYm8uZ2V0SXRlbUNvdW50KCk+MCkKCQkJZlNlcnZlckNvbWJvLnNlbGVjdCgwKTsKCQkKCQlmU2VydmVyQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCgkJCQluZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CgkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewoJCQkJCQlzd2FwQm9keSgpOwoJCQkJCX0KCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KCQkJCX0KCQkJKTsKCX0KCgkKCXByaXZhdGUgU3RyaW5nIGdldFNlcnZlckRlZmluaXRpb25JZCgpCgl7CgkJU3RyaW5nIGN1cnJlbnREZWZpbml0aW9uPSBudWxsOwoJCWlmKGdldFJ1bnRpbWVXb3JraW5nQ29weSgpIT1udWxsKQoJCQljdXJyZW50RGVmaW5pdGlvbiA9ICBnZXRSdW50aW1lV29ya2luZ0NvcHkoKS5nZXRBdHRyaWJ1dGUoR2VuZXJpY1NlcnZlclJ1bnRpbWUuU0VSVkVSX0RFRklOSVRJT05fSUQsIiIpOwoJCWlmKGN1cnJlbnREZWZpbml0aW9uIT0gbnVsbCAmJiBjdXJyZW50RGVmaW5pdGlvbi5sZW5ndGgoKT4wKQoJCXsJCgkJCXJldHVybiBjdXJyZW50RGVmaW5pdGlvbjsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgkKCXByaXZhdGUgdm9pZCBzZWxlY3RTZXJ2ZXJEZWZpbml0aW9uKCkKCXsKCQlTdHJpbmcgY3VycmVudERlZmluaXRpb24gPSBnZXRTZXJ2ZXJEZWZpbml0aW9uSWQoKTsKCQlpbnQgc2VsZWN0SW5kZXggPSAwOwoJCWlmKGN1cnJlbnREZWZpbml0aW9uICE9IG51bGwpCgkJewkKCQkJc2VsZWN0SW5kZXggPSAgZlNlcnZlckNvbWJvLmluZGV4T2YoY3VycmVudERlZmluaXRpb24pOwoJCQlpZihzZWxlY3RJbmRleDwwKQoJCQkJc2VsZWN0SW5kZXggPTA7CgkJfQoJCWZTZXJ2ZXJDb21iby5zZWxlY3Qoc2VsZWN0SW5kZXgpOwoJfQoJCgkKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEZyYWdtZW50I2VudGVyKCkKCSAqLwoJcHVibGljIHZvaWQgZW50ZXIoKSB7CgkJU3RyaW5nIHNlcnZlckRlZmluaXRpb24gPSBnZXRTZXJ2ZXJEZWZpbml0aW9uSWQoKTsKCQlpZihzZXJ2ZXJEZWZpbml0aW9uIT1udWxsICYmIHNlcnZlckRlZmluaXRpb24ubGVuZ3RoKCk+MCkKCQl7CgkJCXNlbGVjdFNlcnZlckRlZmluaXRpb24oKTsKCQkJc3dhcEJvZHkoKTsKCQl9Cgl9CgkKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEZyYWdtZW50I2V4aXQoKQoJICovCglwdWJsaWMgdm9pZCBleGl0KCkgewoJCVN0cmluZyBzZWxlY3RlZCA9IGZTZXJ2ZXJDb21iby5nZXRJdGVtKGZTZXJ2ZXJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKCQlNYXAgcHJvcGVydGllcyA9IGZTZXJ2ZXJQYW5lbC5nZXRQcm9wZXJ0aWVzKCk7CgkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IGdldFJ1bnRpbWVXb3JraW5nQ29weSgpOwoJCQoJCXdjLnNldEF0dHJpYnV0ZShHZW5lcmljU2VydmVyUnVudGltZS5TRVJWRVJfREVGSU5JVElPTl9JRCwgc2VsZWN0ZWQpOwoJCXdjLnNldEF0dHJpYnV0ZShHZW5lcmljU2VydmVyUnVudGltZS5TRVJWRVJfSU5TVEFOQ0VfUFJPUEVSVElFUyxwcm9wZXJ0aWVzKTsKCQl3Yy5zZXROYW1lKGNyZWF0ZU5hbWUoKSk7CgkJZlJ1bnRpbWVXQz1udWxsOwoJfQoJcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTmFtZSgpCgl7CgkgICAgU3RyaW5nIHNlbGVjdGVkID0gZlNlcnZlckNvbWJvLmdldEl0ZW0oZlNlcnZlckNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwoJICAgIElSdW50aW1lV29ya2luZ0NvcHkgd2MgPSBnZXRSdW50aW1lV29ya2luZ0NvcHkoKTsKCSAgICBJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSB3Yy5nZXRSdW50aW1lVHlwZSgpOwoJICAgIFN0cmluZyBuYW1lID0gc2VsZWN0ZWQrIiAoIitydW50aW1lVHlwZS5nZXROYW1lKCkrIikiOwoJICAgIAoJCUlSZXNvdXJjZU1hbmFnZXIgcm0gPSBTZXJ2ZXJDb3JlLmdldFJlc291cmNlTWFuYWdlcigpOwoJCUxpc3QgbGlzdCA9IHJtLmdldFJ1bnRpbWVzKHJ1bnRpbWVUeXBlKTsKCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKCQlpbnQgc3VmZml4ID0gMTsKCQlTdHJpbmcgc3VmZml4TmFtZT1uYW1lOwoJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkKCSAgICB7CgkJICAgCgkgICAgICAgIElFbGVtZW50IGVsID0gKElFbGVtZW50KWl0ZXJhdG9yLm5leHQoKTsKCSAgICAgICAgaWYoZWwuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKXx8IGVsLmdldE5hbWUoKS5lcXVhbHMoc3VmZml4TmFtZSkpCgkgICAgICAgICAgICBzdWZmaXgrKzsKCSAgICAgICAgc3VmZml4TmFtZT0gbmFtZSsiICIrc3VmZml4OwoJICAgIH0KCSAgICAKCQlpZihzdWZmaXg+MSkKCQkgICAgcmV0dXJuIHN1ZmZpeE5hbWU7CgkgICAgcmV0dXJuIG5hbWU7Cgl9CgkKCXByaXZhdGUgSVJ1bnRpbWVXb3JraW5nQ29weSBnZXRSdW50aW1lV29ya2luZ0NvcHkoKQoJewoJCWlmKGZSdW50aW1lV0MgPT0gbnVsbCkKCQkJZlJ1bnRpbWVXQyA9IChJUnVudGltZVdvcmtpbmdDb3B5KWdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJVGFza01vZGVsLlRBU0tfUlVOVElNRSk7IAoJCXJldHVybiBmUnVudGltZVdDOwoJfQp9Cg==