LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHA7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5UcmFjZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7CgppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwovKioKICogTWFuYWdlcyBhIG1vbml0b3Igc2VydmVyIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gaG9zdHMuIFRoaXMKICogY29ubmVjdGlvbiBtYXkgc3Bhd24gb25lIG9yIG1vcmUgVENQL0lQIHJlcXVlc3RzIHRvIGJlIGRpc3BsYXllZAogKiBpbiB0aGUgbW9uaXRvciBzZXJ2ZXIgdmlldy4KICovCnB1YmxpYyBjbGFzcyBIVFRQQ29ubmVjdGlvbiB7Cglwcm90ZWN0ZWQgSU1vbml0b3IgbW9uaXRvcjsKCglwcm90ZWN0ZWQgaW50IHJlcSA9IC0xOwoJcHJvdGVjdGVkIGludCByZXNwID0gLTE7CgoJcHJvdGVjdGVkIExpc3QgcmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0KCk7CgoJLyoqCgkgKiBIVFRQQ29ubmVjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgoJICogCgkgKiBAcGFyYW0gbW9uaXRvciBhIG1vbml0b3IKCSAqLwoJcHVibGljIEhUVFBDb25uZWN0aW9uKElNb25pdG9yIG1vbml0b3IpIHsKCQlzdXBlcigpOwoJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CgkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlRDUC9JUCBtb25pdG9yIGNvbm5lY3Rpb24gb3BlbmVkICIgKyBtb25pdG9yKTsKCX0KCgkvKioKCSAqIEFkZCBhIHJlcXVlc3QuCgkgKiAKCSAqIEBwYXJhbSBiIHRoZSByZXF1ZXN0IGRhdGEKCSAqIEBwYXJhbSBpc05ldyB0cnVlIGlmIG5ldwoJICovCglwdWJsaWMgdm9pZCBhZGRSZXF1ZXN0KGJ5dGVbXSBiLCBib29sZWFuIGlzTmV3KSB7CgkJaWYgKGlzTmV3KQoJCQlyZXEgKys7CgkJSFRUUFJlcXVlc3QgcmVxdWVzdCA9IChIVFRQUmVxdWVzdCkgZ2V0UmVxdWVzdFJlc3BvbnNlKHJlcSk7CgkJcmVxdWVzdC5hZGRUb1JlcXVlc3QoYik7Cgl9CgoJLyoqCgkgKiBBZGQgYSByZXNwb25zZS4KCSAqIAoJICogQHBhcmFtIGIgdGhlIHJlc3BvbnNlIGRhdGEKCSAqIEBwYXJhbSBpc05ldyB0cnVlIGlmIG5ldwoJICovCglwdWJsaWMgdm9pZCBhZGRSZXNwb25zZShieXRlW10gYiwgYm9vbGVhbiBpc05ldykgewoJCWlmIChpc05ldykKCQkJcmVzcCArKzsKCQlIVFRQUmVxdWVzdCByZXF1ZXN0ID0gKEhUVFBSZXF1ZXN0KSBnZXRSZXF1ZXN0UmVzcG9uc2UocmVzcCk7CgkJcmVxdWVzdC5hZGRUb1Jlc3BvbnNlKGIpOwoJfQoKCS8qKgoJICogQWRkIGEgcHJvcGVydHkuCgkgKiAKCSAqIEBwYXJhbSBrZXkKCSAqIEBwYXJhbSB2YWx1ZQoJICovCglwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKCQlSZXF1ZXN0IHJlcXVlc3QgPSBnZXRSZXF1ZXN0UmVzcG9uc2UocmVxKTsKCQlyZXF1ZXN0LnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwoJfQoKCS8qKgoJICogR2V0IHRoZSByZXF1ZXN0LgoJICogCgkgKiBAcGFyYW0gaXNSZXF1ZXN0CgkgKiBAcmV0dXJuIHRoZSByZXF1ZXN0CgkgKi8KCXB1YmxpYyBSZXF1ZXN0IGdldFJlcXVlc3RSZXNwb25zZShib29sZWFuIGlzUmVxdWVzdCkgewoJCWlmIChpc1JlcXVlc3QpCgkJCXJldHVybiBnZXRSZXF1ZXN0UmVzcG9uc2UocmVxKTsKCQkKCQlyZXR1cm4gZ2V0UmVxdWVzdFJlc3BvbnNlKHJlc3ApOwoJfQoKCS8qKgoJICogCgkgKi8KCXByb3RlY3RlZCBSZXF1ZXN0IGdldFJlcXVlc3RSZXNwb25zZShpbnQgaSkgewoJCXN5bmNocm9uaXplZCAodGhpcykgewoJCQl3aGlsZSAoaSA+PSByZXF1ZXN0cy5zaXplKCkpIHsKCQkJCVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBIVFRQUmVxdWVzdCgoTW9uaXRvcikgbW9uaXRvciwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpKTsKCQkJCXJlcXVlc3RzLmFkZChyZXF1ZXN0KTsKCQkJCXJldHVybiByZXF1ZXN0OwoJCQl9CgkJCXJldHVybiAoUmVxdWVzdCkgcmVxdWVzdHMuZ2V0KGkpOwoJCX0KCX0KCgkvKioKCSAqIFNldCB0aGUgdGl0bGUuCgkgKiAKCSAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUKCSAqIEBwYXJhbSBpc05ldyBib29sZWFuCgkgKi8KCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyB0aXRsZSwgYm9vbGVhbiBpc05ldykgewoJCWlmIChpc05ldykKCQkJcmVxICsrOwoJCUhUVFBSZXF1ZXN0IHJlcXVlc3QgPSAoSFRUUFJlcXVlc3QpIGdldFJlcXVlc3RSZXNwb25zZShyZXEpOwoJCXJlcXVlc3Quc2V0TmFtZSh0aXRsZSk7Cgl9Cn0=