LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBDb3B5cmlnaHQgKEMpIDIwMTYgYnkgU2F2b2lyLWZhaXJlIExpbnV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIEF1dGhvcjogSuRnZXIgTmljb2xhcyA8bmljb2xhcy5qYWdlckBzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqDQoqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoNCiogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqDQoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoNCiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoNCiogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojcHJhZ21hIG9uY2UNCg0KbmFtZXNwYWNlIFJpbmdDbGllbnRVV1ANCnsNCg0KLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLw0KcmVmIGNsYXNzIFJpbmdEZWJ1ZzsNCg0KLyogZGVsZWdhdGUgKi8NCmRlbGVnYXRlIHZvaWQgZGVidWdNZXNzYWdlVG9TY3JlZW4oUGxhdGZvcm06OlN0cmluZ14gbWVzc2FnZSk7DQoNCi8qIHRoaXMgaXMgaG93IHRvIGltcGxlbWVudCBhIHNpbmdsZXRvbiBjbGFzcyovDQpwdWJsaWMgcmVmIGNsYXNzIFJpbmdEZWJ1ZyBzZWFsZWQNCnsNCnB1YmxpYzoNCiAgICAvKiBzaW5nbGV0b24gKi8NCiAgICBzdGF0aWMgcHJvcGVydHkgUmluZ0RlYnVnXiBpbnN0YW5jZQ0KICAgIHsNCiAgICAgICAgUmluZ0RlYnVnXiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdGF0aWMgUmluZ0RlYnVnXiBpbnN0YW5jZV8gPSByZWYgbmV3IFJpbmdEZWJ1ZygpOw0KICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qIHByb3BlcnRpZXMgKi8NCg0KICAgIC8qIGZ1bmN0aW9ucyAqLw0KaW50ZXJuYWw6DQogICAgZW51bSBjbGFzcyBUeXBlIHsgTVNHLCBXTkcsIEVSUiB9Ow0KICAgIHZvaWQgcHJpbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsIGNvbnN0IFR5cGUmIHR5cGUgPSBUeXBlOjpNU0cpOw0KDQogICAgLyogZXZlbnQgKi8NCiAgICBldmVudCBkZWJ1Z01lc3NhZ2VUb1NjcmVlbl4gbWVzc2FnZVRvU2NyZWVuOw0KDQpwcml2YXRlOg0KICAgIFJpbmdEZWJ1ZygpIHt9OyAvLyBzaW5nbGV0b24NCn07DQoNCiNkZWZpbmUgTVNHXyhjc3RyKSBDb3JlQXBwbGljYXRpb246Ok1haW5WaWV3LT5Db3JlV2luZG93LT5EaXNwYXRjaGVyLT5SdW5Bc3luYyhDb3JlRGlzcGF0Y2hlclByaW9yaXR5OjpMb3csIFwNCnJlZiBuZXcgRGlzcGF0Y2hlZEhhbmRsZXIoWz1dKCkgeyBSaW5nRGVidWc6Omluc3RhbmNlLT5wcmludChjc3RyKTsgfSkpDQoNCiNkZWZpbmUgV05HXyhjc3RyKSBDb3JlQXBwbGljYXRpb246Ok1haW5WaWV3LT5Db3JlV2luZG93LT5EaXNwYXRjaGVyLT5SdW5Bc3luYyhDb3JlRGlzcGF0Y2hlclByaW9yaXR5OjpMb3csIFwNCnJlZiBuZXcgRGlzcGF0Y2hlZEhhbmRsZXIoWz1dKCkgeyBSaW5nRGVidWc6Omluc3RhbmNlLT5wcmludChzdGQ6OnN0cmluZyhjc3RyKSwgUmluZ0RlYnVnOjpUeXBlOjpXTkcpOyB9KSkNCg0KI2RlZmluZSBFUlJfKGNzdHIpIENvcmVBcHBsaWNhdGlvbjo6TWFpblZpZXctPkNvcmVXaW5kb3ctPkRpc3BhdGNoZXItPlJ1bkFzeW5jKENvcmVEaXNwYXRjaGVyUHJpb3JpdHk6OkxvdywgXA0KcmVmIG5ldyBEaXNwYXRjaGVkSGFuZGxlcihbPV0oKSB7IFJpbmdEZWJ1Zzo6aW5zdGFuY2UtPnByaW50KHN0ZDo6c3RyaW5nKGNzdHIpLCBSaW5nRGVidWc6OlR5cGU6OkVSUik7IH0pKQ0KDQp9DQo=