LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8dHJhY3p5ay5hbmRyZWFzQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2luY2x1ZGUgInBjaC5oIg0KDQojaW5jbHVkZSAiQ29udmVyc2F0aW9uLmgiDQoNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpBcHBsaWNhdGlvbk1vZGVsOjpDb3JlOw0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpDb3JlOw0KDQp1c2luZyBuYW1lc3BhY2UgUmluZ0NsaWVudFVXUDsNCg0KQ29udmVyc2F0aW9uOjpDb252ZXJzYXRpb24oKQ0Kew0KICAgIG1lc3NhZ2VzTGlzdF8gPSByZWYgbmV3ICBWZWN0b3I8Q29udmVyc2F0aW9uTWVzc2FnZV4+KCk7DQp9DQoNCnZvaWQNCkNvbnZlcnNhdGlvbjo6YWRkTWVzc2FnZShTdHJpbmdeIGRhdGUsIGJvb2wgZnJvbUNvbnRhY3QsIFN0cmluZ14gcGF5bG9hZCkNCnsNCiAgICBDb252ZXJzYXRpb25NZXNzYWdlXiBtZXNzYWdlID0gcmVmIG5ldyBDb252ZXJzYXRpb25NZXNzYWdlKCk7DQogICAgbWVzc2FnZS0+RGF0ZSA9IGRhdGU7DQogICAgbWVzc2FnZS0+RnJvbUNvbnRhY3QgPSBmcm9tQ29udGFjdDsNCiAgICBtZXNzYWdlLT5QYXlsb2FkID0gcGF5bG9hZDsNCg0KICAgIC8qIGFkZCBtZXNzYWdlIHRvIF9tZXNzYWdlc0xpc3RfICovDQogICAgbWVzc2FnZXNMaXN0Xy0+QXBwZW5kKG1lc3NhZ2UpOw0KfQ0KDQpKc29uT2JqZWN0Xg0KQ29udmVyc2F0aW9uTWVzc2FnZTo6VG9Kc29uT2JqZWN0KCkNCnsNCiAgICBKc29uT2JqZWN0XiBtZXNzYWdlT2JqZWN0ID0gcmVmIG5ldyBKc29uT2JqZWN0KCk7DQogICAgbWVzc2FnZU9iamVjdC0+U2V0TmFtZWRWYWx1ZShkYXRlS2V5LCBKc29uVmFsdWU6OkNyZWF0ZVN0cmluZ1ZhbHVlKERhdGUpKTsNCiAgICBtZXNzYWdlT2JqZWN0LT5TZXROYW1lZFZhbHVlKGZyb21Db250YWN0S2V5LCBKc29uVmFsdWU6OkNyZWF0ZUJvb2xlYW5WYWx1ZShGcm9tQ29udGFjdCkpOw0KICAgIG1lc3NhZ2VPYmplY3QtPlNldE5hbWVkVmFsdWUocGF5bG9hZEtleSwgSnNvblZhbHVlOjpDcmVhdGVTdHJpbmdWYWx1ZShQYXlsb2FkKSk7DQoNCiAgICBKc29uT2JqZWN0XiBqc29uT2JqZWN0ID0gcmVmIG5ldyBKc29uT2JqZWN0KCk7DQogICAganNvbk9iamVjdC0+U2V0TmFtZWRWYWx1ZShtZXNzYWdlS2V5LCBtZXNzYWdlT2JqZWN0KTsNCg0KICAgIHJldHVybiBqc29uT2JqZWN0Ow0KfQ==