LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHA7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5JTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuUmVxdWVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVHJhY2U7CgppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwovKioKICogTWFuYWdlcyBhIG1vbml0b3Igc2VydmVyIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gaG9zdHMuIFRoaXMKICogY29ubmVjdGlvbiBtYXkgc3Bhd24gb25lIG9yIG1vcmUgVENQL0lQIHJlcXVlc3RzIHRvIGJlIGRpc3BsYXllZAogKiBpbiB0aGUgbW9uaXRvciBzZXJ2ZXIgdmlldy4KICovCnB1YmxpYyBjbGFzcyBIVFRQQ29ubmVjdGlvbiB7Cglwcm90ZWN0ZWQgSU1vbml0b3IgbW9uaXRvcjsKCglwcm90ZWN0ZWQgaW50IHJlcSA9IC0xOwoJcHJvdGVjdGVkIGludCByZXNwID0gLTE7CgoJcHJvdGVjdGVkIExpc3QgcmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0KCk7CgoJLyoqCgkgKiBNb25pdG9ySFRUUENvbm5lY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIEhUVFBDb25uZWN0aW9uKElNb25pdG9yIG1vbml0b3IpIHsKCQlzdXBlcigpOwoJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CgkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlRDUC9JUCBtb25pdG9yIGNvbm5lY3Rpb24gb3BlbmVkICIgKyBtb25pdG9yKTsKCX0KCgkvKioKCSAqIEFkZCBhIHJlcXVlc3QuCgkgKiAKCSAqIEBwYXJhbSBiIHRoZSByZXF1ZXN0IGRhdGEKCSAqIEBwYXJhbSBpc05ldyB0cnVlIGlmIG5ldwoJICovCglwdWJsaWMgdm9pZCBhZGRSZXF1ZXN0KGJ5dGVbXSBiLCBib29sZWFuIGlzTmV3KSB7CgkJaWYgKGlzTmV3KQoJCQlyZXEgKys7CgkJSFRUUFJlcXVlc3QgcmVxdWVzdCA9IChIVFRQUmVxdWVzdCkgZ2V0UmVxdWVzdFJlc3BvbnNlKHJlcSk7CgkJcmVxdWVzdC5hZGRUb1JlcXVlc3QoYik7Cgl9CgoJLyoqCgkgKiBBZGQgYSByZXNwb25zZS4KCSAqIAoJICogQHBhcmFtIGIgdGhlIHJlc3BvbnNlIGRhdGEKCSAqIEBwYXJhbSBpc05ldyB0cnVlIGlmIG5ldwoJICovCglwdWJsaWMgdm9pZCBhZGRSZXNwb25zZShieXRlW10gYiwgYm9vbGVhbiBpc05ldykgewoJCWlmIChpc05ldykKCQkJcmVzcCArKzsKCQlIVFRQUmVxdWVzdCByZXF1ZXN0ID0gKEhUVFBSZXF1ZXN0KSBnZXRSZXF1ZXN0UmVzcG9uc2UocmVzcCk7CgkJcmVxdWVzdC5hZGRUb1Jlc3BvbnNlKGIpOwoJfQoKCS8qKgoJICogCgkgKi8KCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewoJCVJlcXVlc3QgcmVxdWVzdCA9IGdldFJlcXVlc3RSZXNwb25zZShyZXEpOwoJCXJlcXVlc3Quc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Cgl9CgoJLyoqCgkgKiAKCSAqLwoJcHVibGljIFJlcXVlc3QgZ2V0UmVxdWVzdFJlc3BvbnNlKGJvb2xlYW4gaXNSZXF1ZXN0KSB7CgkJaWYgKGlzUmVxdWVzdCkKCQkJcmV0dXJuIGdldFJlcXVlc3RSZXNwb25zZShyZXEpOwoJCQoJCXJldHVybiBnZXRSZXF1ZXN0UmVzcG9uc2UocmVzcCk7Cgl9CgoJLyoqCgkgKiAKCSAqLwoJcHJvdGVjdGVkIFJlcXVlc3QgZ2V0UmVxdWVzdFJlc3BvbnNlKGludCBpKSB7CgkJc3luY2hyb25pemVkICh0aGlzKSB7CgkJCXdoaWxlIChpID49IHJlcXVlc3RzLnNpemUoKSkgewoJCQkJUmVxdWVzdCByZXF1ZXN0ID0gbmV3IEhUVFBSZXF1ZXN0KChNb25pdG9yKSBtb25pdG9yLCBtb25pdG9yLmdldExvY2FsUG9ydCgpLCBtb25pdG9yLmdldFJlbW90ZUhvc3QoKSwgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCkpOwoJCQkJcmVxdWVzdHMuYWRkKHJlcXVlc3QpOwoJCQkJcmV0dXJuIHJlcXVlc3Q7CgkJCX0KCQkJcmV0dXJuIChSZXF1ZXN0KSByZXF1ZXN0cy5nZXQoaSk7CgkJfQoJfQoKCS8qKgoJICogU2V0IHRoZSB0aXRsZS4KCSAqIAoJICogQHBhcmFtIHRpdGxlIHRoZSB0aXRsZQoJICogQHBhcmFtIGlzTmV3IGJvb2xlYW4KCSAqLwoJcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIHRpdGxlLCBib29sZWFuIGlzTmV3KSB7CgkJaWYgKGlzTmV3KQoJCQlyZXEgKys7CgkJSFRUUFJlcXVlc3QgcmVxdWVzdCA9IChIVFRQUmVxdWVzdCkgZ2V0UmVxdWVzdFJlc3BvbnNlKHJlcSk7CgkJcmVxdWVzdC5zZXROYW1lKHRpdGxlKTsKCX0KfQ==