LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci8qKgogKiAKICovCnB1YmxpYyBjbGFzcyBSdW50aW1lIGV4dGVuZHMgQmFzZSBpbXBsZW1lbnRzIElSdW50aW1lIHsKCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUlVOVElNRV9UWVBFX0lEID0gInJ1bnRpbWUtdHlwZS1pZCI7Cglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsKCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVEVTVF9FTlZJUk9OTUVOVCA9ICJ0ZXN0LWVudmlyb25tZW50IjsKCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU1RVQiA9ICJzdHViIjsKCglwcm90ZWN0ZWQgSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlOwoJcHJvdGVjdGVkIFJ1bnRpbWVEZWxlZ2F0ZSBkZWxlZ2F0ZTsKCglwdWJsaWMgUnVudGltZShJRmlsZSBmaWxlKSB7CgkJc3VwZXIoZmlsZSk7Cgl9CgoJcHVibGljIFJ1bnRpbWUoSUZpbGUgZmlsZSwgU3RyaW5nIGlkLCBJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKCQlzdXBlcihmaWxlLCBpZCk7CgkJdGhpcy5ydW50aW1lVHlwZSA9IHJ1bnRpbWVUeXBlOwoJCW1hcC5wdXQoUFJPUF9OQU1FLCBydW50aW1lVHlwZS5nZXROYW1lKCkpOwoJfQoKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklSdW50aW1lI2dldFJ1bnRpbWVUeXBlKCkKCSAqLwoJcHVibGljIElSdW50aW1lVHlwZSBnZXRSdW50aW1lVHlwZSgpIHsKCQlyZXR1cm4gcnVudGltZVR5cGU7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gdGhlIHZhbGlkYXRpb24gc3RhdHVzIG9mIHRoZSBydW50aW1lLgoJICogCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewoJCXRyeSB7CgkJCXJldHVybiBnZXREZWxlZ2F0ZShtb25pdG9yKS52YWxpZGF0ZSgpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgdmFsaWRhdGUoKSAiICsgdG9TdHJpbmcoKSwgZSk7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglwdWJsaWMgUnVudGltZURlbGVnYXRlIGdldERlbGVnYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewoJCWlmIChkZWxlZ2F0ZSAhPSBudWxsKQoJCQlyZXR1cm4gZGVsZWdhdGU7CgkJCgkJc3luY2hyb25pemVkICh0aGlzKSB7CgkJCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7CgkJCQl0cnkgewoJCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJCQkJCVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlMiA9IChSdW50aW1lVHlwZSkgcnVudGltZVR5cGU7CgkJCQkJZGVsZWdhdGUgPSAoUnVudGltZURlbGVnYXRlKSBydW50aW1lVHlwZTIuZ2V0RWxlbWVudCgpLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CgkJCQkJZGVsZWdhdGUuaW5pdGlhbGl6ZSh0aGlzKTsKCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QRVJGT1JNQU5DRSwgIlJ1bnRpbWUuZ2V0RGVsZWdhdGUoKTogPCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICI+ICIgKyBnZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwoJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gZGVsZWdhdGU7Cgl9CgkKCS8qKgoJICogUmV0dXJucyB0cnVlIGlmIHRoZSBkZWxlZ2F0ZSBoYXMgYmVlbiBsb2FkZWQuCgkgKiAKCSAqIEByZXR1cm4KCSAqLwoJcHVibGljIGJvb2xlYW4gaXNEZWxlZ2F0ZUxvYWRlZCgpIHsKCQlyZXR1cm4gZGVsZWdhdGUgIT0gbnVsbDsKCX0KCQoJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkKCQkJZGVsZWdhdGUuZGlzcG9zZSgpOwoJfQoJCglwdWJsaWMgSVJ1bnRpbWVXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpIHsKCQlyZXR1cm4gbmV3IFJ1bnRpbWVXb3JraW5nQ29weSh0aGlzKTsgCgl9CgoJcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgkKCXB1YmxpYyBib29sZWFuIGlzRGVsZWdhdGVQbHVnaW5BY3RpdmF0ZWQoKSB7CgkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoKFJ1bnRpbWVUeXBlKSBydW50aW1lVHlwZSkuZ2V0RWxlbWVudCgpOwoJCVN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7CgkJcmV0dXJuIFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFOwoJfQoJCgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JUnVudGltZSNnZXRMb2NhdGlvbigpCgkgKi8KCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpIHsKCQlTdHJpbmcgdGVtcCA9IGdldEF0dHJpYnV0ZShQUk9QX0xPQ0FUSU9OLCAoU3RyaW5nKW51bGwpOwoJCWlmICh0ZW1wID09IG51bGwpCgkJCXJldHVybiBudWxsOwoJCXJldHVybiBuZXcgUGF0aCh0ZW1wKTsKCX0KCQoJcHJvdGVjdGVkIHZvaWQgZGVsZXRlRnJvbU1ldGFkYXRhKCkgewoJCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZVJ1bnRpbWUodGhpcyk7Cgl9CgoJcHJvdGVjdGVkIHZvaWQgc2F2ZVRvTWV0YWRhdGEoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CgkJc3VwZXIuc2F2ZVRvTWV0YWRhdGEobW9uaXRvcik7CgkJUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkUnVudGltZSh0aGlzKTsKCX0KCglwcm90ZWN0ZWQgU3RyaW5nIGdldFhNTFJvb3QoKSB7CgkJcmV0dXJuICJydW50aW1lIjsKCX0KCglwdWJsaWMgYm9vbGVhbiBpc1Rlc3RFbnZpcm9ubWVudCgpIHsKCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfVEVTVF9FTlZJUk9OTUVOVCwgZmFsc2UpOwoJfQoKCXB1YmxpYyBib29sZWFuIGlzU3R1YigpIHsKCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfU1RVQiwgZmFsc2UpOwoJfQoKCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsKFJ1bnRpbWVXb3JraW5nQ29weSB3YykgewoJCW1hcCA9IHdjLm1hcDsKCQlydW50aW1lVHlwZSA9IHdjLnJ1bnRpbWVUeXBlOwoJCWZpbGUgPSB3Yy5maWxlOwoJCWRlbGVnYXRlID0gd2MuZGVsZWdhdGU7CgkJCgkJaW50IHRpbWVzdGFtcCA9IHdjLmdldFRpbWVzdGFtcCgpOwoJCW1hcC5wdXQoInRpbWVzdGFtcCIsIEludGVnZXIudG9TdHJpbmcodGltZXN0YW1wKzEpKTsKCX0KCglwcm90ZWN0ZWQgdm9pZCBsb2FkU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewoJCVN0cmluZyBydW50aW1lVHlwZUlkID0gbWVtZW50by5nZXRTdHJpbmcoUFJPUF9SVU5USU1FX1RZUEVfSUQpOwoJCWlmIChydW50aW1lVHlwZUlkICE9IG51bGwpCgkJCXJ1bnRpbWVUeXBlID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUocnVudGltZVR5cGVJZCk7CgkJZWxzZQoJCQlydW50aW1lVHlwZSA9IG51bGw7Cgl9CgoJcHJvdGVjdGVkIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkKCQkJbWVtZW50by5wdXRTdHJpbmcoUFJPUF9SVU5USU1FX1RZUEVfSUQsIHJ1bnRpbWVUeXBlLmdldElkKCkpOwoJfQoKCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CgkJaWYgKCEob2JqIGluc3RhbmNlb2YgUnVudGltZSkpCgkJCXJldHVybiBmYWxzZTsKCQkKCQlSdW50aW1lIHJ1bnRpbWUgPSAoUnVudGltZSkgb2JqOwoJCXJldHVybiBydW50aW1lLmdldElkKCkuZXF1YWxzKGdldElkKCkpOwoJfQoJCgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQoJICovCglwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewoJCVJ1bnRpbWVEZWxlZ2F0ZSBkZWxlZ2F0ZTIgPSBnZXREZWxlZ2F0ZShudWxsKTsKCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGRlbGVnYXRlMikpCgkJCXJldHVybiBkZWxlZ2F0ZTsKCQlyZXR1cm4gbnVsbDsKCX0KCQoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlyZXR1cm4gIlJ1bnRpbWVbIiArIGdldElkKCkgKyAiLCAiICsgZ2V0TmFtZSgpICsgIiwgIiArIGdldExvY2F0aW9uKCkgKyAiLCAiICsgZ2V0UnVudGltZVR5cGUoKSArICJdIjsKCX0KfQ==