LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJMaXN0ZW5lcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNlcnZlckV2ZW50OwovKioKICogTm90aWZpY2F0aW9uIG1hbmFnZXIgZm9yIHNlcnZlci4KICogCiAqIEBzaW5jZSAxLjAKICovCnB1YmxpYyBjbGFzcyBTZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyIHsKCXByaXZhdGUgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CgkKCS8qKgoJICogRm9yIG1hc2tpbmcgZXZlbnQgb24gYWxsIGNoYW5nZXMuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9FVkVOVFMgPSAweEZGRkY7CgkKCXByaXZhdGUgY2xhc3MgTGlzdGVuZXJFbnRyeSB7CgkJcHJpdmF0ZSBJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXI7CgkJcHJpdmF0ZSBpbnQgZXZlbnRNYXNrOwoJCQoJCXByaXZhdGUgTGlzdGVuZXJFbnRyeShJU2VydmVyTGlzdGVuZXIgY3VyTGlzdGVuZXIsIGludCBjdXJFdmVudE1hc2spIHsKCQkJbGlzdGVuZXIgPSBjdXJMaXN0ZW5lcjsKCQkJZXZlbnRNYXNrID0gY3VyRXZlbnRNYXNrOwoJCX0KCQkKCQlJU2VydmVyTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7CgkJCXJldHVybiBsaXN0ZW5lcjsKCQl9CgkJCgkJaW50IGdldEV2ZW50TWFzaygpIHsKCQkJcmV0dXJuIGV2ZW50TWFzazsKCQl9Cgl9CgoJLyoqCgkgKiBMYXVuY2hhYmxlQ2xpZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBTZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyKCkgewoJCXN1cGVyKCk7Cgl9CgoKCS8qKgoJICogQWRkIGxpc3RlbmVyIGZvciBhbGwgZXZlbnRzLgoJICogQHBhcmFtIGN1ckxpc3RlbmVyCgkgKi8KCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBjdXJMaXN0ZW5lcikgewoJCWFkZExpc3RlbmVyKGN1ckxpc3RlbmVyLCBBTExfRVZFTlRTKTsKCX0KCQoJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVNlcnZlckxpc3RlbmVyIGN1ckxpc3RlbmVyLCBpbnQgZXZlbnRNYXNrKSB7CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLT4tIEFkZGluZyBzZXJ2ZXIgbGlzdGVuZXIgdG8gbm90aWZpY2F0aW9uIG1hbmFnZXI6ICIgKyBjdXJMaXN0ZW5lciArICIgIiArIGV2ZW50TWFzayArICIgLT4tIik7CgkJaWYgKGN1ckxpc3RlbmVyID09IG51bGwpIHsKCQkJcmV0dXJuOwoJCX0KCQkKCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTGlzdCkgewoJCQlsaXN0ZW5lckxpc3QuYWRkKG5ldyBMaXN0ZW5lckVudHJ5KGN1ckxpc3RlbmVyLCBldmVudE1hc2spKTsKCQl9Cgl9CgkKCXB1YmxpYyB2b2lkIGJyb2FkY2FzdENoYW5nZShTZXJ2ZXJFdmVudCBldmVudCkgewoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0+LSBCcm9hZGNhc3Rpbmcgc2VydmVyIGV2ZW50OiAiICsgZXZlbnQgKyAiIC0+LSIpOwoJCWlmIChldmVudCA9PSBudWxsKSB7CgkJCXJldHVybjsKCQl9CgkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICIgIFNlcnZlciBldmVudCBraW5kOiAiICsgZXZlbnRLaW5kICsgIiAtPi0iKTsKCQkKCQkvLyBPbmx5IG5vdGlmeSBsaXN0ZW5lcnMgdGhhdCBsaXN0ZW4gdG8gbW9kdWxlIGV2ZW50LgoJCUl0ZXJhdG9yIGxpc3RlbmVySXRlciA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOwoJCXdoaWxlIChsaXN0ZW5lckl0ZXIuaGFzTmV4dCgpKSB7CgkJCUxpc3RlbmVyRW50cnkgY3VyRW50cnkgPSAoTGlzdGVuZXJFbnRyeSlsaXN0ZW5lckl0ZXIubmV4dCgpOwoJCQlpbnQgbWFzayA9IGN1ckVudHJ5LmdldEV2ZW50TWFzaygpOwoJCQkvLyBDaGVjayBpZiB0aGUgdHlwZSBvZiB0aGUgZXZlbnQgbWF0Y2hlcyB0aGUgbWFzaywgZS5nLiBzZXJ2ZXIgb3IgbW9kdWxlIGNoYW5nZS4KCQkJYm9vbGVhbiBpc1R5cGVNYXRjaCA9ICgobWFzayAmIGV2ZW50S2luZCAmIFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UpICE9IDApIAoJCQkJCQkJCQkJCQkJCXx8ICgobWFzayAmIGV2ZW50S2luZCAmIFNlcnZlckV2ZW50Lk1PRFVMRV9DSEFOR0UpICE9IDApOwoJCQkvLyBDaGVjayB0aGUga2luZCBvZiBjaGFuZ2UuCgkJCWJvb2xlYW4gaXNLaW5kTWF0Y2ggPSAobWFzayAmIGV2ZW50S2luZCBeIFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgXiBTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFKSAhPSAwOwoJCQlpZiAoaXNUeXBlTWF0Y2ggJiYgaXNLaW5kTWF0Y2gpIHsKCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0+LSBGaXJpbmcgc2VydmVyIGV2ZW50IHRvIGxpc3RlbmVyOiAiICsgY3VyRW50cnkuZ2V0TGlzdGVuZXIoKSArICIgLT4tIik7CgkJCQl0cnkgewoJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIiAgRmlyaW5nIHNlcnZlciBldmVudCB0byBsaXN0ZW5lcjogIiArIGN1ckVudHJ5LmdldExpc3RlbmVyKCkpOwoJCQkJCWN1ckVudHJ5LmdldExpc3RlbmVyKCkuc2VydmVyQ2hhbmdlZChldmVudCk7CgkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgRXJyb3IgZmlyaW5nIHNlcnZlciBldmVudDogIiArIGN1ckVudHJ5LmdldExpc3RlbmVyKCksIGUpOwoJCQkJfQoJCQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLTwtIERvbmUgRmlyaW5nIHNlcnZlciBldmVudCAtPC0iKTsKCQkJfQoJCX0KCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPC0gRG9uZSBicm9hZGNhc3Rpbmcgc2VydmVyIGV2ZW50IC08LSIpOwoJfQoJCgkvKioKCSAqIAoJICogQHJldHVybiB0cnVlIGlmIHRoZSBsaXN0ZW5lciBsaXN0IGlzIG5vdCBlbXB0eTsgb3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLgoJICovCglwdWJsaWMgYm9vbGVhbiBoYXNMaXN0ZW5lckVudHJpZXMoKSB7CgkJcmV0dXJuIGxpc3RlbmVyTGlzdC5zaXplKCkgPT0gMDsKCX0KCQoJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVNlcnZlckxpc3RlbmVyIGN1ckxpc3RlbmVyKSB7CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLT4tIFJlbW92aW5nIHNlcnZlciBsaXN0ZW5lciBmcm9tIG5vdGlmaWNhdGlvbiBtYW5hZ2VyOiAiICsgY3VyTGlzdGVuZXIgKyAiIC0+LSIpOwoJCWlmIChjdXJMaXN0ZW5lciA9PSBudWxsKSB7CgkJCXJldHVybjsKCQl9CgkJTGlzdGVuZXJFbnRyeSBtYXRjaGVkTGlzdGVuZXJFbnRyeSA9IG51bGw7CgkJSXRlcmF0b3IgbGlzdGVuZXJJdGVyID0gbGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7CgkJd2hpbGUgKG1hdGNoZWRMaXN0ZW5lckVudHJ5ID09IG51bGwgJiYgbGlzdGVuZXJJdGVyLmhhc05leHQoKSkgewoJCQlMaXN0ZW5lckVudHJ5IGN1ckVudHJ5ID0gKExpc3RlbmVyRW50cnkpbGlzdGVuZXJJdGVyLm5leHQoKTsKCQkJaWYgKGN1ckxpc3RlbmVyLmVxdWFscyhjdXJFbnRyeS5nZXRMaXN0ZW5lcigpKSkgewoJCQkJbWF0Y2hlZExpc3RlbmVyRW50cnkgPSBjdXJFbnRyeTsKCQkJfQoJCX0KCQlpZiAobWF0Y2hlZExpc3RlbmVyRW50cnkgIT0gbnVsbCkgewoJCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTGlzdCkgewoJCQkJbGlzdGVuZXJMaXN0LnJlbW92ZShtYXRjaGVkTGlzdGVuZXJFbnRyeSk7CgkJCX0KCQl9Cgl9Cn0K