LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogNzV4X2FkYy5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDAzLzEwLzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgQURDIHNvZnR3YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA3LzE3LzIwMDYgOiBWMS4wDQoqIDAzLzEwLzIwMDYgOiBWMC4xDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBUSEUgUFJFU0VOVCBTT0ZUV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUgVElNRS4NCiogQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIA0KKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORyBGUk9NIFRIRQ0KKiBDT05URU5UIE9GIFNVQ0ggU09GVFdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFIENPRElORyANCiogSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgIjc1eF9hZGMuaCINCiNpbmNsdWRlICI3NXhfbXJjYy5oIg0KDQovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiBNYXNrIGZvciBQb3dlciBEb3duIE1vZGUgKi8NCiNkZWZpbmUgQURDX1Bvd2VyRG93bl9FbmFibGUgIDB4ODAwMA0KI2RlZmluZSBBRENfUG93ZXJEb3duX0Rpc2FibGUgMHg3RkZGDQoNCi8qIE1hc2sgZm9yIFdhdGNoZG9nIFRocmVzaG9sZHMgRW5hYmxlICovDQojZGVmaW5lIEFEQ19BbmFsb2dXYXRjaGRvZ19FbmFibGUgIDB4ODAwMA0KI2RlZmluZSBBRENfQW5hbG9nV2F0Y2hkb2dfRGlzYWJsZSAweDdGRkYNCg0KLyogTWFzayBmb3IgSW5qZWN0ZWQgY29udmVyc2lvbiBzdGFydCAqLw0KI2RlZmluZSBBRENfSW5qZWNfQ29udmVyc2lvblN0YXJ0ICAweDgwMDANCg0KLyogRE1BIGVuYWJsZSAqLw0KI2RlZmluZSBBRENfRE1BX0V4dEVuYWJsZV9NYXNrICAweDQwMDANCg0KLyogSW5qZWN0ZWQgc3RhcnQgdHJpZ2dlciBlbmFibGUgKi8NCiNkZWZpbmUgQURDX0luamVjX0V4dFRyaWdnZXJfRW5hYmxlICAgMHg0MDAwDQoNCi8qIEFEQyBNYXNrcyAqLw0KI2RlZmluZSBBRENfRE1BRmlyc3RFbmFibGVkQ2hhbm5lbF9NYXNrICAweDAwMEYgDQojZGVmaW5lIEFEQ19EYXRhUmVnaXN0ZXJPZmZzZXQgICAgICAgICAgIDB4MDA1MA0KI2RlZmluZSBBRENfRmlyc3RDaGFubmVsX01hc2sgICAgICAgICAgICAweEZGRjANCiNkZWZpbmUgQURDX0NoYW5uZWxOdW1iZXJfTWFzayAgICAgICAgICAgMHhGQzNGDQojZGVmaW5lIEFEQ19UaHJlc2hvbGRfTWFzayAgICAgICAgICAgICAgIDB4RkMwMA0KI2RlZmluZSBBRENfQW5hbG9nV2F0Y2hkb2dDaGFubmVsX01hc2sgICAweEMzRkYNCiNkZWZpbmUgQURDX1ByZXNjYWxlcnNfTWFzayAgICAgICAgICAgICAgMHg3RjE4DQojZGVmaW5lIEFEQ19TUEVOX01hc2sgICAgICAgICAgICAgICAgICAgIDB4ODAwMA0KI2RlZmluZSBBRENfRmFsbGluZ0VkZ2VfTWFzayAgICAgICAgICAgICAweEVGRkYNCiNkZWZpbmUgQURDX0xvd0xldmVsX01hc2sgICAgICAgICAgICAgICAgMHg0MDAwDQojZGVmaW5lIEFEQ19IaWdoTGV2ZWxfTWFzayAgICAgICAgICAgICAgIDB4REZGRg0KI2RlZmluZSBBRENfQ2FsaWJyYXRpb25fTWFzayAgICAgICAgICAgICAweDAwMDINCgkNCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19EZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIERlc2NyaXB0aW9uICAgIDogRGVpbml0aWFsaXplcyB0aGUgQURDIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQNCiogICAgICAgICAgICAgICAgICByZXNldCB2YWx1ZXMuDQoqIElucHV0ICAgICAgICAgIDogTm9uZS4gIA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19EZUluaXQodm9pZCkNCnsNCiAgLyogUmVzZXQgdGhlIEFEQyByZWdpc3RlcnMgdmFsdWVzKi8NCiAgTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfQURDLEVOQUJMRSk7DQogIE1SQ0NfUGVyaXBoZXJhbFNXUmVzZXRDb25maWcoTVJDQ19QZXJpcGhlcmFsX0FEQyxESVNBQkxFKTsgDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIERlc2NyaXB0aW9uICAgIDogSW5pdGlhbGl6ZXMgdGhlIEFEQyAgcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIEFEQ19Jbml0U3RydWN0Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gQURDX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYW4gQURDX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQogICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBBREMgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIFJldHVybiAgICAgICAgIDogTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0luaXQoQURDX0luaXRUeXBlRGVmKiBBRENfSW5pdFN0cnVjdCkNCnsNCiAgLyogQ29uZmlndXJlIHRoZSBjb252ZXJzaW9uIG1vZGUgKi8NCiAgaWYoQURDX0luaXRTdHJ1Y3QtPkFEQ19Db252ZXJzaW9uTW9kZSA9PSBBRENfQ29udmVyc2lvbk1vZGVfU2NhbikNCiAgew0KICAgIC8qIFNldCB0aGUgc2NhbiBjb252ZXJzaW9uIG1vZGUgKi8NCiAgICBBREMtPkNMUjIgfD0gQURDX0NvbnZlcnNpb25Nb2RlX1NjYW47DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogU2V0IHRoZSBvbmUtc2hvdCBjb252ZXJzaW9uIG1vZGUgKi8NCiAgICBBREMtPkNMUjIgJj0gQURDX0NvbnZlcnNpb25Nb2RlX09uZVNob3Q7DQogIH0NCiAgDQogIC8qIENvbmZpZ3VyZSB0aGUgZXh0ZXJuYWwgc3RhcnQgY29udmVyc2lvbiB0cmlnZ2VyICovDQogIHN3aXRjaChBRENfSW5pdFN0cnVjdC0+QURDX0V4dFRyaWdnZXIpDQogIHsNCiAgICBjYXNlIEFEQ19FeHRUcmlnZ2VyX0hpZ2hMZXZlbDoNCiAgICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gb24gSGlnaCBsZXZlbCBvZiB0aGUgZXh0ZXJuYWwgdHJpZ2dlciAoVElNMCkgKi8NCiAgICAgIEFEQy0+Q0xSMCAmPSBBRENfSGlnaExldmVsX01hc2s7DQogICAgICBBREMtPkNMUjAgfD0gQURDX0V4dFRyaWdnZXJfSGlnaExldmVsOw0KICAgICAgYnJlYWs7DQogICAgICANCiAgICBjYXNlIEFEQ19FeHRUcmlnZ2VyX0xvd0xldmVsOg0KICAgICAgLyogU3RhcnQgY29udmVyc2lvbiBvbiBsb3cgbGV2ZWwgb2YgdGhlIGV4dGVybmFsIHRyaWdnZXIgKFRJTTApICovDQogICAgICBBREMtPkNMUjAgJj0gQURDX0V4dFRyaWdnZXJfTG93TGV2ZWw7IA0KICAgICAgQURDLT5DTFIwIHw9IEFEQ19Mb3dMZXZlbF9NYXNrOw0KICAgICAgYnJlYWs7DQogICAgICANCiAgICBjYXNlIEFEQ19FeHRUcmlnZ2VyX1Jpc2luZ0VkZ2U6DQogICAgICAvKiBTdGFydCBjb252ZXJzaW9uIG9uIHJpc2luZyBlZGdlIG9mIHRoZSBleHRlcm5hbCB0cmlnZ2VyIChUSU0wKSAqLw0KICAgICAgQURDLT5DTFIwIHw9IEFEQ19FeHRUcmlnZ2VyX1Jpc2luZ0VkZ2U7DQogICAgICBicmVhazsNCiAgICANCiAgICBjYXNlIEFEQ19FeHRUcmlnZ2VyX0ZhbGxpbmdFZGdlOg0KICAgICAgLyogU3RhcnQgY29udmVyc2lvbiBvbiBmYWxsaW5nIGVkZ2Ugb2YgdGhlIGV4dGVybmFsIHRyaWdnZXIgKFRJTTApICovDQogICAgICBBREMtPkNMUjAgJj0gQURDX0ZhbGxpbmdFZGdlX01hc2s7DQogICAgICBBREMtPkNMUjAgfD0gQURDX0V4dFRyaWdnZXJfRmFsbGluZ0VkZ2U7DQogICAgICBicmVhazsNCiAgICANCiAgICBjYXNlIEFEQ19FeHRUcmlnZ2VyX0Rpc2FibGU6DQogICAgICAvKiBEaXNhYmxlIHRoZSBleHRlcm5hbCB0cmlnZ2VyIGFuZCBzdGFydCB0aGUgY29udmVyc2lvbiBieSBzb2Z0d2FyZSAqLw0KICAgICAgQURDLT5DTFIwICY9IEFEQ19FeHRUcmlnZ2VyX0Rpc2FibGU7DQogICAgICBicmVhazsNCg0KICAgIGRlZmF1bHQ6DQogICAgICBicmVhazsgDQogIH0NCg0KICAvKiBDb25maWd1cmUgdGhlIGF1dG8gY2xvY2sgb2ZmIGZlYXR1cmUgKi8NCiAgaWYgKEFEQ19Jbml0U3RydWN0LT5BRENfQXV0b0Nsb2NrT2ZmID09IEFEQ19BdXRvQ2xvY2tPZmZfRW5hYmxlKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBhdXRvIGNsb2NrIG9mZiBmZWF0dXJlICovDQogICAgQURDLT5DTFI0IHw9IEFEQ19BdXRvQ2xvY2tPZmZfRW5hYmxlOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIGF1dG8gY2xvY2sgb2ZmIGZlYXR1cmUgKi8NCiAgICBBREMtPkNMUjQgJj0gQURDX0F1dG9DbG9ja09mZl9EaXNhYmxlOwkNCiAgfQ0KICANCiAgLyogQ2xlYXIgY29udmVyc2lvbiBwcmVzY2FsZXIgQ05WUFsyOjBdLCBzYW1wbGluZyBwcmVzY2FsZXIgU01QUFsyOjBdIGJpdHMgDQogICAgIGFuZCBTYW1wbGUgcHJlc2NhbGVyIGVuYWJsZSBTUEVOIGJpdCAqLw0KICBBREMtPkNMUjEgJj0gQURDX1ByZXNjYWxlcnNfTWFzazsNCiAgLyogU2V0IGNvbnZlcnNpb24gcHJlc2NhbGVyIHZhbHVlIChzYW1wbGluZyBhbmQgY29udmVyc2lvbiBwcmVzY2FsZXJzIGFyZSBlcXVhbA0KICAgICB3aGlsZSBTUEVOIGJpdCBpcyByZXNldCAqLyANCiAgQURDLT5DTFIxIHw9IChBRENfSW5pdFN0cnVjdC0+QURDX0NvbnZlcnNpb25QcmVzY2FsZXI8PDUpOw0KICANCiAgLyogSW4gY2FzZSBBRENfU2FtcGxpbmdQcmVzY2FsZXIgbWVtYmVyIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjb252ZXJzaW9uIG9uZSAqLw0KICBpZihBRENfSW5pdFN0cnVjdC0+QURDX1NhbXBsaW5nUHJlc2NhbGVyICE9IEFEQ19Jbml0U3RydWN0LT5BRENfQ29udmVyc2lvblByZXNjYWxlcikNCiAgew0KICAgIC8qIFNldCB0aGUgc2FtcGxpbmcgcHJlc2NhbGVyIHZhbHVlICovDQogICAgQURDLT5DTFIxIHw9IEFEQ19Jbml0U3RydWN0LT5BRENfU2FtcGxpbmdQcmVzY2FsZXI7DQogICAgLyogU2V0IFNQRU4gYml0IChzYW1wbGluZyBhbmQgY29udmVyc2lvbiBwcmVzY2FsZXJzIGFyZSBkaWZmZXJlbnQgKi8NCiAgICBBREMtPkNMUjEgPSAoQURDLT5DTFIxIHwgQURDX1NQRU5fTWFzayk7CQ0KICB9DQogIA0KICAvKiBDbGVhciBmaXJzdCBjaGFubmVsIHRvIGJlIGNvbnZlcnRlZCBGQ0hbMzowXSBiaXRzICovDQogIEFEQy0+Q0xSMiAmPSBBRENfRmlyc3RDaGFubmVsX01hc2s7DQogIC8qIFNldCB0aGUgZmlyc3QgY2hhbm5lbCB0byBiZSBjb252ZXJ0ZWQgKi8NCiAgQURDLT5DTFIyIHw9IEFEQ19Jbml0U3RydWN0LT5BRENfRmlyc3RDaGFubmVsOw0KICAvKiBDbGVhciBudW1iZXIgb2YgY2hhbm5lbHMgdG8gYmUgY29udmVydGVkIE5DSFszOjBdIGJpdHMgKi8NCiAgQURDLT5DTFIyICY9IEFEQ19DaGFubmVsTnVtYmVyX01hc2s7ICANCiAgLyogU2V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gYmUgY29udmVydGVkICovDQogIEFEQy0+Q0xSMiB8PSAoKEFEQ19Jbml0U3RydWN0LT5BRENfQ2hhbm5lbE51bWJlciktMTw8Nik7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX1N0cnVjdEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiogRGVzY3JpcHRpb24gICAgOiBGaWxscyBlYWNoIEFEQ19Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gQURDX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYW4gQURDX0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KICAgICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4gIA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUgDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19TdHJ1Y3RJbml0KEFEQ19Jbml0VHlwZURlZiogQURDX0luaXRTdHJ1Y3QpDQp7DQogIC8qIEluaXRpYWxpemUgdGhlIEFEQ19Db252ZXJzaW9uTW9kZSBtZW1iZXIgKi8NCiAgQURDX0luaXRTdHJ1Y3QtPkFEQ19Db252ZXJzaW9uTW9kZSA9IEFEQ19Db252ZXJzaW9uTW9kZV9PbmVTaG90Ow0KICANCiAgLyogSW5pdGlhbGl6ZSB0aGUgQURDX0V4dFRyaWdnZXIgbWVtYmVyICovDQogIEFEQ19Jbml0U3RydWN0LT5BRENfRXh0VHJpZ2dlciA9IEFEQ19FeHRUcmlnZ2VyX0Rpc2FibGU7DQogIA0KICAvKiBJbml0aWFsaXplIHRoZSBBRENfQXV0b0Nsb2NrT2ZmIG1lbWJlciAqLw0KICBBRENfSW5pdFN0cnVjdC0+QURDX0F1dG9DbG9ja09mZiA9IEFEQ19BdXRvQ2xvY2tPZmZfRGlzYWJsZTsNCiAgDQogIC8qIEluaXRpYWxpemUgdGhlIEFEQ19TYW1wbGluZ1ByZXNjYWxlciBtZW1iZXIgKi8NCiAgQURDX0luaXRTdHJ1Y3QtPkFEQ19TYW1wbGluZ1ByZXNjYWxlciA9IDA7DQogIA0KICAvKiBJbml0aWFsaXplIHRoZSBBRENfQ29udmVyc2lvblByZXNjYWxlciBtZW1iZXIgKi8NCiAgQURDX0luaXRTdHJ1Y3QtPkFEQ19Db252ZXJzaW9uUHJlc2NhbGVyID0gMDsNCiAgDQogIC8qIEluaXRpYWxpemUgdGhlIEFEQ19GaXJzdENoYW5uZWwgbWVtYmVyICovDQogIEFEQ19Jbml0U3RydWN0LT5BRENfRmlyc3RDaGFubmVsID0gQURDX0NIQU5ORUwwOw0KICANCiAgLyogSW5pdGlhbGl6ZSB0aGUgQURDX0NoYW5uZWxOdW1iZXIgbWVtYmVyICovDQogIEFEQ19Jbml0U3RydWN0LT5BRENfQ2hhbm5lbE51bWJlciA9IDE7DQogfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19TdGFydENhbGlicmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqIERlc2NyaXB0aW9uICAgIDogU3RhcnRzIHRoZSBBREMgQ2FsaWJyYXRpb24uIENhbGlicmF0aW9uIGF2ZXJhZ2UgZW5hYmxlZC9kaXNhYmxlZC4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ19DYWxpYkF2ZXJhZ2U6IEVuYWJsZXMgb3IgZGlzYWJsZXMgQURDIGNhbGlicmF0aW9uIGF2ZXJhZ2UuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DYWxpYkF2ZXJhZ2VfRW5hYmxlOiAgZW5hYmxlIGNhbGlicmF0aW9uIGF2ZXJhZ2UgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NhbGliQXZlcmFnZV9EaXNhYmxlOiBkaXNhYmxlIGNhbGlicmF0aW9uIGF2ZXJhZ2UgIA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUgDQoqIFJldHVybiAgICAgICAgIDogTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19TdGFydENhbGlicmF0aW9uKHUxNiBBRENfQ2FsaWJBdmVyYWdlKQ0Kew0KICBpZiAoQURDX0NhbGliQXZlcmFnZSA9PSBBRENfQ2FsaWJBdmVyYWdlX0VuYWJsZSkNCiAgew0KICAgIC8qIEVuYWJsZSBBREMgQ2FsaWJyYXRpb24gQXZlcmFnZSAqLw0KICAgIEFEQy0+Q0xSNCAmPSBBRENfQ2FsaWJBdmVyYWdlX0VuYWJsZTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIEFEQyBDYWxpYnJhdGlvbiBBdmVyYWdlICovDQogICAgQURDLT5DTFI0IHw9IEFEQ19DYWxpYkF2ZXJhZ2VfRGlzYWJsZTsNCiAgfQ0KDQogIC8qIFN0YXJ0IENhbGlicmF0aW9uICovDQogIEFEQy0+Q0xSMCB8PSBBRENfQ2FsaWJyYXRpb25fT047DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX0dldENhbGlicmF0aW9uU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogR2V0IHRoZSBBREMgQ2FsaWJyYXRpb24gU3RhdHVzLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lIA0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBOZXdTdGF0ZSBvZiB0aGUgQURDIGNhbGlicmF0aW9uIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgQURDX0dldENhbGlicmF0aW9uU3RhdHVzKHZvaWQpDQp7DQogIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIEFEQyBjYWxpYnJhdGlvbiAqLw0KICBpZigoQURDLT5DTFIwICYgQURDX0NhbGlicmF0aW9uX01hc2spICE9IFJFU0VUKQ0KICB7DQogICAgLyogUmV0dXJuIFNFVCBpZiBBREMgQ2FsaWJyYXRpb24gaXMgb24gZ29pbmcgKi8NCiAgICByZXR1cm4gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFJldHVybiBSRVNFVCBpZiBBREMgQ2FsaWJyYXRpb24gaXMgZmluaXNoZWQgKi8NCiAgICByZXR1cm4gUkVTRVQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfQ29udmVyc2lvbkNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IFN0YXJ0cyBvciBzdG9wcyB0aGUgQURDIGNvbnZlcnNpb24uDQoqIElucHV0ICAgICAgICAgIDogLSBBRENfQ29udmVyc2lvbjogc3BlY2lmaWVzIHRoZSBBREMgY29tbWFuZCB0byBhcHBseS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NvbnZlcnNpb25fU3RhcnQ6IHN0YXJ0IGNvbnZlcnNpb24gDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NvbnZlcnNpb25fU3RvcDogIHN0b3AgY29udmVyc2lvbiANCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0NvbnZlcnNpb25DbWQgKHUxNiBBRENfQ29udmVyc2lvbikNCnsNCiAgaWYgKEFEQ19Db252ZXJzaW9uID09IEFEQ19Db252ZXJzaW9uX1N0YXJ0KQ0KICB7DQogICAgLyogU3RhcnQgdGhlIEFEQyBDb252ZXJzaW9uICovDQogICAgQURDLT5DTFIwIHw9IEFEQ19Db252ZXJzaW9uX1N0YXJ0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFN0b3AgdGhlIEFEQyBDb252ZXJzaW9uICovDQogICAgQURDLT5DTFIwICY9IEFEQ19Db252ZXJzaW9uX1N0b3A7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfR2V0U1RBUlRCaXRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBBREMgU1RBUlQvU1RPUCBiaXQgU3RhdHVzLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lIA0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBOZXdTdGF0ZSBvZiB0aGUgQURDIFNUQVJUL1NUT1AgYml0IChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgQURDX0dldFNUQVJUQml0U3RhdHVzKHZvaWQpDQp7DQogIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIEFEQyBTVEFSVC9TVE9QIGJpdCAqLw0KICBpZigoQURDLT5DTFIwICYgQURDX0NvbnZlcnNpb25fU3RhcnQpICE9IFJFU0VUKQ0KICB7DQogICAgLyogUmV0dXJuIFNFVCBpZiBBREMgQ29udmVyc2lvbiBpcyBzdGFydGVkICovDQogICAgcmV0dXJuIFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBSZXR1cm4gUkVTRVQgaWYgQURDIENvbnZlcnNpb24gaXMgc3RvcHBlZCAqLw0KICAgIHJldHVybiBSRVNFVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19DbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIHRoZSBBREMgcGVyaXBoZXJhbCBvciBwdXRzIGl0IGluIHBvd2VyIGRvd24gbW9kZS4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEFEQyBwZXJpcGhlcmFsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZSAgDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19DbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBpZiAoTmV3U3RhdGUgPT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSBBREMgUG93ZXIgRG93biBNb2RlICovDQogICAgQURDLT5DTFI0IHw9IEFEQ19Qb3dlckRvd25fRW5hYmxlOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgQURDIFBvd2VyIERvd24gTW9kZSAqLw0KICAgIEFEQy0+Q0xSNCAmPSBBRENfUG93ZXJEb3duX0Rpc2FibGU7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfQXV0b0Nsb2NrT2ZmQ29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBBdXRvIGNsb2NrIG9mZiBmZWF0dXJlLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgQXV0byBjbG9jayBvZmYgZmVhdHVyZS4gVGhpcyANCiogICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLiAgDQoqIE91dHB1dCAgICAgICAgIDogTm9uZSAgIA0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0F1dG9DbG9ja09mZkNvbmZpZyhGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGlmIChOZXdTdGF0ZSA9PSBFTkFCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgQURDIEF1dG8gQ2xvY2sgT2ZmICovDQogICAgQURDLT5DTFI0IHw9IEFEQ19BdXRvQ2xvY2tPZmZfRW5hYmxlOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgQURDIEF1dG8gQ2xvY2sgT2ZmICovDQogICAgQURDLT5DTFI0ICY9IEFEQ19BdXRvQ2xvY2tPZmZfRGlzYWJsZTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19BbmFsb2dXYXRjaGRvZ0NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVsIHRvIGJlIHVzZWQgZm9yIHRoZSBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyBhbmQgZGVmaW5lcyBpdHMgY29ycmVzcG9uZGluZyBIaWdoIGFuZCBMb3cgDQoqICAgICAgICAgICAgICAgICAgdGhyZXNob2xkIHZhbHVlcy4gICAgICAgICAgICAgICANCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ19BbmFsb2dXYXRjaGRvZzogc3BlY2lmaWVzIHRoZSBhbmFsb2cgd2F0Y2hkb2cgd2hpY2ggd2lsbA0KKiAgICAgICAgICAgICAgICAgICAgYmUgYWZmZWN0ZWQgdG8gdGhlIGRlc2lyZWQgY29udmVydGVkIGNoYW5uZWwuIFRoaXMgcGFyYW1ldGVyDQoqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiANCiogICAgICAgICAgICAgICAgICAgICAtIEFEQ19BbmFsb2dXYXRjaGRvZzA6IHNlbGVjdCBhbmFsb2cgd2F0Y2hkb2cgMA0KKiAgICAgICAgICAgICAgICAgICAgIC0gQURDX0FuYWxvZ1dhdGNoZG9nMTogc2VsZWN0IGFuYWxvZyB3YXRjaGRvZyAxDQoqICAgICAgICAgICAgICAgICAgICAgLSBBRENfQW5hbG9nV2F0Y2hkb2cyOiBzZWxlY3QgYW5hbG9nIHdhdGNoZG9nIDINCiogICAgICAgICAgICAgICAgICAgICAtIEFEQ19BbmFsb2dXYXRjaGRvZzM6IHNlbGVjdCBhbmFsb2cgd2F0Y2hkb2cgMw0KKiAgICAgICAgICAgICAgICAgIC0gQURDX0NIQU5ORUw6IHNwZWNpZmllcyB0aGUgY2hhbm5lbCBsaW5rZWQgdG8gdGhlIHNlbGVjdGVkIA0KKiAgICAgICAgICAgICAgICAgICAgYW5hbG9nIHdhdGNoZG9nLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgQURDX0NIQU5ORUx4IHdoZXJlIHggDQoqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgKDAuLjE1KSAgICAgICAgICAgICAgICAgICAgDQoqICAgICAgICAgICAgICAgICAgLSBMb3dUaHJlc2hvbGQ6IExvdyBUaHJlc2hvbGQgZm9yIHRoZSBzZWxlY3RlZCBBbmFsb2cgd2F0Y2hkb2cNCiogICAgICAgICAgICAgICAgICAtIEhpZ2hUaHJlc2hvbGQ6IEhpZ2ggVGhyZXNob2xkIGZvciB0aGUgc2VsZWN0ZWQgQW5hbG9nIHdhdGNoZG9nDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19BbmFsb2dXYXRjaGRvZ0NvbmZpZyh1MTYgQURDX0FuYWxvZ1dhdGNoZG9nLCB1OCBBRENfQ0hBTk5FTCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgTG93VGhyZXNob2xkLCB1MTYgSGlnaFRocmVzaG9sZCkNCnsNCiAgc3dpdGNoIChBRENfQW5hbG9nV2F0Y2hkb2cpDQogIHsNCiAgICAvKiBTZXQgdGhlIHNlbGVjdGVkIGNoYW5uZWwgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgSGlnaCBhbmQgTG93IHRocmVzaG9sZHMgKi8NCiAgICBjYXNlIEFEQ19BbmFsb2dXYXRjaGRvZzAgOg0KICAgICAgQURDLT5UUkEwID0gKEFEQy0+VFJBMCAmIEFEQ19BbmFsb2dXYXRjaGRvZ0NoYW5uZWxfTWFzaykgfCAoKHUxNikgQURDX0NIQU5ORUw8PDEwKTsNCiAgICAgIEFEQy0+VFJBMCA9IChBREMtPlRSQTAgJiBBRENfVGhyZXNob2xkX01hc2spIHwgIEhpZ2hUaHJlc2hvbGQ7DQogICAgICBBREMtPlRSQjAgPSAoQURDLT5UUkIwICYgQURDX1RocmVzaG9sZF9NYXNrKSB8ICBMb3dUaHJlc2hvbGQ7DQogICAgICBicmVhazsNCg0KICAgIGNhc2UgQURDX0FuYWxvZ1dhdGNoZG9nMSA6DQogICAgICBBREMtPlRSQTEgPSAoQURDLT5UUkExICYgQURDX0FuYWxvZ1dhdGNoZG9nQ2hhbm5lbF9NYXNrKSB8ICgodTE2KSBBRENfQ0hBTk5FTDw8MTApOw0KICAgICAgQURDLT5UUkExID0gKEFEQy0+VFJBMSAmIEFEQ19UaHJlc2hvbGRfTWFzaykgfCAgSGlnaFRocmVzaG9sZDsNCiAgICAgIEFEQy0+VFJCMSA9IChBREMtPlRSQjEgJiBBRENfVGhyZXNob2xkX01hc2spIHwgIExvd1RocmVzaG9sZDsNCiAgICAgIGJyZWFrOw0KDQogICAgY2FzZSBBRENfQW5hbG9nV2F0Y2hkb2cyIDoNCiAgICAgIEFEQy0+VFJBMiA9IChBREMtPlRSQTIgJiBBRENfQW5hbG9nV2F0Y2hkb2dDaGFubmVsX01hc2spIHwgKCh1MTYpIEFEQ19DSEFOTkVMPDwxMCk7DQogICAgICBBREMtPlRSQTIgPSAoQURDLT5UUkEyICYgQURDX1RocmVzaG9sZF9NYXNrKSB8ICBIaWdoVGhyZXNob2xkOw0KICAgICAgQURDLT5UUkIyID0gKEFEQy0+VFJCMiAmIEFEQ19UaHJlc2hvbGRfTWFzaykgfCAgTG93VGhyZXNob2xkOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIEFEQ19BbmFsb2dXYXRjaGRvZzMgOg0KICAgICAgQURDLT5UUkEzID0gKEFEQy0+VFJBMyAmIEFEQ19BbmFsb2dXYXRjaGRvZ0NoYW5uZWxfTWFzaykgfCAoKHUxNikgQURDX0NIQU5ORUw8PDEwKTsNCiAgICAgIEFEQy0+VFJBMyA9IChBREMtPlRSQTMgJiBBRENfVGhyZXNob2xkX01hc2spIHwgIEhpZ2hUaHJlc2hvbGQ7DQogICAgICBBREMtPlRSQjMgPSAoQURDLT5UUkIzICYgQURDX1RocmVzaG9sZF9NYXNrKSB8ICBMb3dUaHJlc2hvbGQ7DQogICAgICBicmVhazsNCg0KICAgIGRlZmF1bHQ6DQogICAgICBicmVhazsgDQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfQW5hbG9nV2F0Y2hkb2dDbWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNlbGVjdGVkIGFuYWxvZyBXYXRjaGRvZy4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ19BbmFsb2dXYXRjaGRvZzogc3BlY2lmaWVzIHRoZSBhbmFsb2cgd2F0Y2hkb2cgdG8gYmUgDQoqICAgICAgICAgICAgICAgICAgICBlbmFibGVkIG9yIGRpc2FibGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSANCiogICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IA0KKiAgICAgICAgICAgICAgICAgICAgIC0gQURDX0FuYWxvZ1dhdGNoZG9nMDogc2VsZWN0IGFuYWxvZyB3YXRjaGRvZyAwDQoqICAgICAgICAgICAgICAgICAgICAgLSBBRENfQW5hbG9nV2F0Y2hkb2cxOiBzZWxlY3QgYW5hbG9nIHdhdGNoZG9nIDENCiogICAgICAgICAgICAgICAgICAgICAtIEFEQ19BbmFsb2dXYXRjaGRvZzI6IHNlbGVjdCBhbmFsb2cgd2F0Y2hkb2cgMg0KKiAgICAgICAgICAgICAgICAgICAgIC0gQURDX0FuYWxvZ1dhdGNoZG9nMzogc2VsZWN0IGFuYWxvZyB3YXRjaGRvZyAzDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgYW5hbG9nIHdhdGNoZG9nLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19BbmFsb2dXYXRjaGRvZ0NtZCh1MTYgQURDX0FuYWxvZ1dhdGNoZG9nLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGlmIChOZXdTdGF0ZSA9PSBFTkFCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBBbmFsb2dXYXRjaGRvZ3ggKi8NCiAgICBzd2l0Y2ggKEFEQ19BbmFsb2dXYXRjaGRvZykNCiAgICB7DQogICAgICBjYXNlIEFEQ19BbmFsb2dXYXRjaGRvZzAgOiANCiAgICAgICAgQURDLT5UUkIwIHw9IEFEQ19BbmFsb2dXYXRjaGRvZ19FbmFibGU7DQogICAgICAgIGJyZWFrOw0KDQogICAgICBjYXNlIEFEQ19BbmFsb2dXYXRjaGRvZzEgOiANCiAgICAgICAgQURDLT5UUkIxIHw9IEFEQ19BbmFsb2dXYXRjaGRvZ19FbmFibGU7ICANCiAgICAgICAgYnJlYWs7DQoNCiAgICAgIGNhc2UgQURDX0FuYWxvZ1dhdGNoZG9nMiA6IA0KICAgICAgICBBREMtPlRSQjIgfD0gQURDX0FuYWxvZ1dhdGNoZG9nX0VuYWJsZTsgIA0KICAgICAgICBicmVhazsNCg0KICAgICAgY2FzZSBBRENfQW5hbG9nV2F0Y2hkb2czIDogDQogICAgICAgIEFEQy0+VFJCMyB8PSBBRENfQW5hbG9nV2F0Y2hkb2dfRW5hYmxlOyAgDQogICAgICAgIGJyZWFrOw0KDQogICAgICBkZWZhdWx0Og0KICAgICAgICBicmVhazsgDQogICAgfQ0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEFEQyBBbmFsb2dXYXRjaGRvZ3ggKi8NCiAgICBzd2l0Y2ggKEFEQ19BbmFsb2dXYXRjaGRvZykNCiAgICB7DQogICAgICBjYXNlIEFEQ19BbmFsb2dXYXRjaGRvZzAgOiANCiAgICAgICAgQURDLT5UUkIwICY9IEFEQ19BbmFsb2dXYXRjaGRvZ19EaXNhYmxlOyAgDQogICAgICAgIGJyZWFrOw0KDQogICAgICBjYXNlIEFEQ19BbmFsb2dXYXRjaGRvZzEgOiANCiAgICAgICAgQURDLT5UUkIxICY9IEFEQ19BbmFsb2dXYXRjaGRvZ19EaXNhYmxlOyAgDQogICAgICAgIGJyZWFrOw0KDQogICAgICBjYXNlIEFEQ19BbmFsb2dXYXRjaGRvZzIgOiANCiAgICAgICAgQURDLT5UUkIyICY9IEFEQ19BbmFsb2dXYXRjaGRvZ19EaXNhYmxlOyAgDQogICAgICAgIGJyZWFrOw0KDQogICAgICBjYXNlIEFEQ19BbmFsb2dXYXRjaGRvZzMgOiANCiAgICAgICAgQURDLT5UUkIzICY9IEFEQ19BbmFsb2dXYXRjaGRvZ19EaXNhYmxlOyAgDQogICAgICAgIGJyZWFrOw0KDQogICAgICBkZWZhdWx0Og0KICAgICAgICBicmVhazsgDQogICAgfQ0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX0dldEFuYWxvZ1dhdGNoZG9nUmVzdWx0DQoqIERlc2NyaXB0aW9uICAgIDogUmV0dXJucyB0aGUgY29tcGFyaXNvbiByZXN1bHQgb2YgdGhlIHNlbGVjdGVkIGFuYWxvZyB3YXRjaGRvZy4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ19BbmFsb2dXYXRjaGRvZzogc3BlY2lmaWVzIHRoZSBhbmFsb2cgd2F0Y2hkb2cgY2hhbm5lbCANCiogICAgICAgICAgICAgICAgICAgIHdoaWNoIGl0cyBjb21wYXJpc29uIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkLiBUaGlzIHBhcmFtZXRlcg0KKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogDQoqICAgICAgICAgICAgICAgICAgICAgLSBBRENfQW5hbG9nV2F0Y2hkb2cwOiBzZWxlY3QgYW5hbG9nIHdhdGNoZG9nIDANCiogICAgICAgICAgICAgICAgICAgICAtIEFEQ19BbmFsb2dXYXRjaGRvZzE6IHNlbGVjdCBhbmFsb2cgd2F0Y2hkb2cgMQ0KKiAgICAgICAgICAgICAgICAgICAgIC0gQURDX0FuYWxvZ1dhdGNoZG9nMjogc2VsZWN0IGFuYWxvZyB3YXRjaGRvZyAyDQoqICAgICAgICAgICAgICAgICAgICAgLSBBRENfQW5hbG9nV2F0Y2hkb2czOiBzZWxlY3QgYW5hbG9nIHdhdGNoZG9nIDMNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIGFuYWxvZyB3YXRjaGRvZyBjb21wYXJhaXNvbiByZXN1bHQgdmFsdWUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgQURDX0dldEFuYWxvZ1dhdGNoZG9nUmVzdWx0KHUxNiBBRENfQW5hbG9nV2F0Y2hkb2cpDQp7DQogIC8qIFJldHVybiB0aGUgc2VsZWN0ZWQgQURDIEFuYWxvZ1dhdGNoZG9neCBjb21wYXJhaXNvbiByZXN1bHQgKi8NCiAgc3dpdGNoKEFEQ19BbmFsb2dXYXRjaGRvZykNCiAgew0KICAgIGNhc2UgQURDX0FuYWxvZ1dhdGNoZG9nMCA6DQogICAgICByZXR1cm4gKChBREMtPlBCUiAmIEFEQ19BbmFsb2dXYXRjaGRvZyk+PjQpOw0KDQogICAgY2FzZSBBRENfQW5hbG9nV2F0Y2hkb2cxIDoNCiAgICAgIHJldHVybiAoKEFEQy0+UEJSICYgQURDX0FuYWxvZ1dhdGNoZG9nKT4+Nik7DQoNCiAgICBjYXNlIEFEQ19BbmFsb2dXYXRjaGRvZzIgOg0KICAgICAgcmV0dXJuICgoQURDLT5QQlIgJiBBRENfQW5hbG9nV2F0Y2hkb2cpPj44KTsNCg0KICAgIGNhc2UgQURDX0FuYWxvZ1dhdGNoZG9nMyA6DQogICAgICByZXR1cm4gKChBREMtPlBCUiAmIEFEQ19BbmFsb2dXYXRjaGRvZyk+PjEwKTsNCg0KICAgIGRlZmF1bHQgOiByZXR1cm4gKDB4RkYpOyAgLyogaWYgYSB3cm9uZyB2YWx1ZSBvZiBBRENfQW5hbG9nV2F0Y2hkb2cgaXMgc2VsZWN0ZWQgKi8NCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19JbmplY3RlZENvbnZlcnNpb25Db25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBzdGFydCB0cmlnZ2VyIGxldmVsIGZvciB0aGUgaW5qZWN0ZWQgY2hhbm5lbHMgDQoqICAgICAgICAgICAgICAgICAgYW5kIHRoZSBpbmplY3RlZCBhbmFsb2cgaW5wdXQgY2hhbm5lbHMgdG8gYmUgY29udmVydGVkLiANCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ19JbmplY19FeHRUcmlnZ2VyOiBzcGVjaWZpZXMgdGhlIHN0YXJ0IHRyaWdnZXIgbGV2ZWwuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JbmplY19FeHRUcmlnZ2VyX0Rpc2FibGUgOiBleHRlcm5hbCB0cmlnZ2VyIGRpc2FibGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0luamVjX0V4dFRyaWdnZXJfUmlzaW5nRWRnZTogZXh0ZXJuYWwgdHJpZ2dlcg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgYXMgcmlzaW5nIGVkZ2Ugb2YgUFdNIFRpbWVyIFRSR08gc2lnbmFsDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0luamVjX0V4dFRyaWdnZXJfRmFsbGluZ0VkZ2U6IGV4dGVybmFsIHRyaWdnZXIgDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZCBhcyBmYWxsaW5nIGVkZ2Ugb2YgUFdNIFRpbWVyIFRSR08gc2lnbmFsIA0KKiAgICAgICAgICAgICAgICAgIC0gRmlyc3RDaGFubmVsOiBzcGVjaWZpZXMgdGhlIGZpcnN0IGluamVjdGVkIGNoYW5uZWwgdG8gYmUNCiogICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZC4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgQURDX0NIQU5ORUx4ICB3aGVyZSB4IGNhbiBiZSAoMC4uMTUpLiANCiogICAgICAgICAgICAgICAgICAtIENoYW5uZWxOdW1iZXI6IHNwZWNpZmllcyB0aGUgTnVtYmVyIG9mIHRoZSBpbmplY3RlZCBjaGFubmVscyANCiogICAgICAgICAgICAgICAgICAgIHRvIGJlIGNvbnZlcnRlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgIHZhbHVlIGZyb20gMSB0byAxNi4gICAgDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19JbmplY3RlZENvbnZlcnNpb25Db25maWcodTE2IEFEQ19JbmplY19FeHRUcmlnZ2VyLCB1OCBGaXJzdENoYW5uZWwsIHU4IENoYW5uZWxOdW1iZXIpDQp7DQogIC8qIENvbmZpZ3VyZSB0aGUgZXh0ZXJuYWwgc3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyICovDQogIHN3aXRjaCAoQURDX0luamVjX0V4dFRyaWdnZXIpDQogIHsNCiAgICBjYXNlIEFEQ19JbmplY19FeHRUcmlnZ2VyX0Rpc2FibGUgIDoNCiAgICAgIC8qIERpc2FibGUgdGhlIGV4dGVybmFsIHRyaWdnZXIgYW5kIHN0YXJ0IHRoZSBpbmplY3RlZCBjb252ZXJzaW9uIGJ5IHNvZnR3YXJlICovDQogICAgICBBREMtPkNMUjMgJj0gQURDX0luamVjX0V4dFRyaWdnZXJfRGlzYWJsZSA7DQogICAgICBicmVhazsNCiAgICBjYXNlIEFEQ19JbmplY19FeHRUcmlnZ2VyX1Jpc2luZ0VkZ2UgOg0KICAgICAgLyogU3RhcnQgaW5qZWN0ZWQgY29udmVyc2lvbiBvbiByaXNpbmcgZWRnZSBvZiB0aGUgZXh0ZXJuYWwgdHJpZ2dlciAoUFdNKSAqLw0KICAgICAgQURDLT5DTFIzIHw9IEFEQ19JbmplY19FeHRUcmlnZ2VyX1Jpc2luZ0VkZ2U7DQogICAgICBicmVhazsNCiAgICBjYXNlIEFEQ19JbmplY19FeHRUcmlnZ2VyX0ZhbGxpbmdFZGdlIDoNCiAgICAgIC8qIFN0YXJ0IGluamVjdGVkIGNvbnZlcnNpb24gb24gZmFsbGluZyBlZGdlIG9mIHRoZSBleHRlcm5hbCB0cmlnZ2VyIChQV00pICovDQogICAgICBBREMtPkNMUjMgfD0gQURDX0luamVjX0V4dFRyaWdnZXJfRW5hYmxlOyANCiAgICAgIEFEQy0+Q0xSMyAmPSBBRENfSW5qZWNfRXh0VHJpZ2dlcl9GYWxsaW5nRWRnZTsNCiAgICAgIGJyZWFrOw0KDQogICAgZGVmYXVsdDoNCiAgICAgIGJyZWFrOw0KICB9DQogIA0KICAvKiBDbGVhciBmaXJzdCBpbmplY3RlZCBjaGFubmVsIHRvIGJlIGNvbnZlcnRlZCBKRkNIWzM6MF0gYml0cyAqLw0KICBBREMtPkNMUjMgJj0gQURDX0ZpcnN0Q2hhbm5lbF9NYXNrOw0KICAvKiBTZXQgdGhlIGZpcnN0IGluamVjdGVkIGNoYW5uZWwgdG8gYmUgY29udmVydGVkICovDQogIEFEQy0+Q0xSMyB8PSBGaXJzdENoYW5uZWw7DQogIC8qIENsZWFyIG51bWJlciBvZiBpbmplY3RlZCBjaGFubmVscyB0byBiZSBjb252ZXJ0ZWQgSk5DSFszOjBdIGJpdHMgKi8NCiAgQURDLT5DTFIzICY9IEFEQ19DaGFubmVsTnVtYmVyX01hc2s7ICANCiAgLyogU2V0IHRoZSBudW1iZXIgb2YgaW5qZWN0ZWQgY2hhbm5lbHMgdG8gYmUgY29udmVydGVkICovDQogIEFEQy0+Q0xSMyB8PSAoKENoYW5uZWxOdW1iZXItMSk8PDYpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19TdGFydEluamVjdGVkQ29udmVyc2lvbg0KKiBEZXNjcmlwdGlvbiAgICA6IFN0YXJ0cyBieSBzb2Z0d2FyZSB0aGUgY29udmVyc2lvbiBvZiB0aGUgaW5qZWN0ZWQgaW5wdXQgY2hhbm5lbHMuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBBRENfU3RhcnRJbmplY3RlZENvbnZlcnNpb24odm9pZCkNCnsNCiAgLyogU3RhcnQgdGhlIGluamVjdGVkIEFEQyBDb252ZXJzaW9uICovDQogIEFEQy0+Q0xSMyB8PSBBRENfSW5qZWNfQ29udmVyc2lvblN0YXJ0Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19HZXRDb252ZXJzaW9uVmFsdWUNCiogRGVzY3JpcHRpb24gICAgOiBSZWFkcyB0aGUgY29udmVyc2lvbiByZXN1bHQgZnJvbSB0aGUgYXBwcm9wcmlhdGUgZGF0YSByZWdpc3Rlci4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ19DSEFOTkVMIDpzcGVjaWZpZXMgdGhlIEFEQyBjaGFubmVsIHdoaWNoIGl0cyBjb252ZXJzaW9uIA0KKiAgICAgICAgICAgICAgICAgICAgdmFsdWUgaGF2ZSB0byBiZSByZXR1cm5lZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEFEQ19DSEFOTkVMeA0KKiAgICAgICAgICAgICAgICAgICAgd2hlcmUgeCBjYW4gYmUgKDAuLjE1KSB0byBzZWxlY3QgY2hhbm5lbHggIA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgcmV0dXJuZWQgdmFsdWUgaG9sZHMgdGhlIGNvbnZlcnNpb24gcmVzdWx0IG9mIHRoZSBzZWxlY3RlZCAgIA0KKiAgICAgICAgICAgICAgICAgIGNoYW5uZWwuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IEFEQ19HZXRDb252ZXJzaW9uVmFsdWUodTggQURDX0NIQU5ORUwpDQp7DQogIC8qIFJldHVybiB0aGUgY29udmVyc2lvbiByZXN1bHQgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwgKi8NCiAgcmV0dXJuICooKHUxNiAqKShBRENfQkFTRSArICgoQURDX0NIQU5ORUw8PDIpICsgQURDX0RhdGFSZWdpc3Rlck9mZnNldCkpKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfSVRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgQURDIGludGVycnVwdHMuDQoqIElucHV0ICAgICAgICAgIDogLSBBRENfSVQ6IHNwZWNpZmllcyB0aGUgQURDIGludGVycnVwdHMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0VDSDogIEVuZCBvZiBjaGFpbiBjb252ZXJzaW9uIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9FT0M6ICBFbmQgb2YgY2hhbm5lbCBjb252ZXJzaW9uIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9KRUNIOiBJbmplY3RlZCBlbmQgb2YgY2hhaW4gY29udmVyc2lvbiBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfSkVPQzogSW5qZWN0ZWQgZW5kIG9mIGNoYW5uZWwgY29udmVyc2lvbiBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfQW5hbG9nV2F0Y2hkb2cwX0xvd1RocmVzaG9sZDoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDAgTG93VGhyZXNob2xkIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9BbmFsb2dXYXRjaGRvZzBfSGlnaFRocmVzaG9sZDoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDAgSGlnaFRocmVzaG9sZCBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfQW5hbG9nV2F0Y2hkb2cxX0xvd1RocmVzaG9sZDoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDEgTG93VGhyZXNob2xkIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9BbmFsb2dXYXRjaGRvZzFfSGlnaFRocmVzaG9sZDoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDEgSGlnaFRocmVzaG9sZCBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfQW5hbG9nV2F0Y2hkb2cyX0xvd1RocmVzaG9sZDoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDIgTG93VGhyZXNob2xkIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9BbmFsb2dXYXRjaGRvZzJfSGlnaFRocmVzaG9sZDoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDIgSGlnaFRocmVzaG9sZCBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfQW5hbG9nV2F0Y2hkb2czX0xvd1RocmVzaG9sZDoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDMgTG93VGhyZXNob2xkIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9BbmFsb2dXYXRjaGRvZzNfSGlnaFRocmVzaG9sZDoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyA1IEhpZ2hUaHJlc2hvbGQgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0FMTDogIEFsbCBpbnRlcnJ1cHRzDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgQURDIGludGVycnVwdHMuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBBRENfSVRDb25maWcodTE2IEFEQ19JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBpZiAoTmV3U3RhdGUgPT0gRU5BQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgaW50ZXJydXB0cyAqLw0KICAgIEFEQy0+SU1SIHw9IEFEQ19JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgaW50ZXJydXB0cyAqLw0KICAgIEFEQy0+SU1SICY9IH5BRENfSVQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfRE1BQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgQURDknMgRE1BIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ19ETUFfQ0hBTk5FTDogc3BlY2lmaWVzIHRoZSBjaGFubmVscyB0byBiZSBlbmFibGVkIG9yIA0KKiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgZm9yIERNQSB0cmFuc2Zlci4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSANCiogICAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIEFEQ19ETUFfQ0hBTk5FTHggd2hlcmUgeCBjYW4gYmUgKDAuLjE1KS4gDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgQURDIERNQSBjaGFubmVscy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19ETUFDb25maWcodTE2IEFEQ19ETUFfQ0hBTk5FTCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBpZihOZXdTdGF0ZSA9PSBFTkFCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgRE1BIGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbHMgKi8NCiAgICBBREMtPkRNQVIgfD0gQURDX0RNQV9DSEFOTkVMIDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIERNQSBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWxzICovDQogICAgQURDLT5ETUFSICY9IH5BRENfRE1BX0NIQU5ORUw7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfRE1BQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlIG9yIGRpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdGhlIEFEQy4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ19ETUE6IHNwZWNpZmllcyB0aGUgRE1BIGNvbW1hbmQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSANCiogICAgICAgICAgICAgICAgICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRE1BX0Rpc2FibGU6IGRpc2FibGUgdGhlIERNQSBjYXBhYmlsaXR5DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0RNQV9FbmFibGU6IGVuYWJsZWQgYnkgc2V0dGluZyB0aGUgZ2xvYmFsIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSBiaXQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRE1BX0V4dFRyaWdnZXJfSGlnaExldmVsOiBlbmFibGVkIGJ5IGRldGVjdGlvbiBvZg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggbGV2ZWwgb2YgVElNMiBPQzIgc2lnbmFsDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0RNQV9FeHRUcmlnZ2VyX0xvd0xldmVsOiBlbmFibGVkIGJ5IGRldGVjdGlvbiBvZg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdyBsZXZlbCBvZiBUSU0yIE9DMiBzaWduYWwNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0RNQUNtZCh1MTYgQURDX0RNQSkNCnsNCiAgLyogQ29uZmlndXJlIHRoZSBETUEgZXh0ZXJuYWwgdHJpZ2dlciBlbmFibGUgKi8NCiAgc3dpdGNoIChBRENfRE1BKQ0KICB7DQogICAgY2FzZSBBRENfRE1BX0Rpc2FibGUgOg0KICAgICAgLyogRGlzYWJsZSBETUEgdHJhbnNmZXIgKi8NCiAgICAgIEFEQy0+RE1BRSAmPSBBRENfRE1BX0Rpc2FibGU7DQogICAgICBicmVhazsNCiAgICAgIA0KICAgIGNhc2UgQURDX0RNQV9FbmFibGUgOg0KICAgICAgLyogRW5hYmxlIERNQSB0cmFuc2ZlciAqLw0KICAgICAgQURDLT5ETUFFIHw9IEFEQ19ETUFfRW5hYmxlOw0KICAgICAgYnJlYWs7DQogICAgICANCiAgICBjYXNlIEFEQ19ETUFfRXh0VHJpZ2dlcl9IaWdoTGV2ZWwgOg0KICAgICAgLyogRW5hYmxlIERNQSB0cmFuc2ZlciBvbiBoaWdoIGxldmVsIG9mIHRoZSBleHRlcm5hbCB0cmlnZ2VyIChUSU0yKSAqLw0KICAgICAgQURDLT5ETUFFICY9IEFEQ19ETUFfRGlzYWJsZTsNCiAgICAgIEFEQy0+RE1BRSB8PSBBRENfRE1BX0V4dFRyaWdnZXJfSGlnaExldmVsOw0KICAgICAgYnJlYWs7DQogICAgICANCiAgICBjYXNlIEFEQ19ETUFfRXh0VHJpZ2dlcl9Mb3dMZXZlbCA6DQogICAgICAvKiBFbmFibGUgRE1BIHRyYW5zZmVyIG9uIGxvdyBsZXZlbCBvZiB0aGUgZXh0ZXJuYWwgdHJpZ2dlciAoVElNMikgKi8NCiAgICAgIEFEQy0+RE1BRSB8PSBBRENfRE1BX0V4dEVuYWJsZV9NYXNrOyANCiAgICAgIEFEQy0+RE1BRSAmPSBBRENfRE1BX0V4dFRyaWdnZXJfTG93TGV2ZWw7DQogICAgICBicmVhazsNCg0KICAgIGRlZmF1bHQ6DQogICAgICBicmVhazsgICAgICANCiAgfSAgDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX0dldERNQUZpcnN0RW5hYmxlZENoYW5uZWwNCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBmaXJzdCBETUEtZW5hYmxlZCBjaGFubmVsIGNvbmZpZ3VyZWQgYXQgdGhlIHRpbWUgdGhhdA0KKiAgICAgICAgICAgICAgICAgIERNQSB3YXMgbGFzdCBnbG9iYWxseSBlbmFibGVkLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIGZpcnN0IERNQSBlbmFibGVkIGNoYW5uZWwNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgQURDX0dldERNQUZpcnN0RW5hYmxlZENoYW5uZWwodm9pZCkNCnsNCiAgLyogUmV0dXJuIHRoZSBETUEgZmlyc3QgZW5hYmxlZCBjaGFubmVsICovDQogIHJldHVybiAoQURDLT5ETUFFICYgQURDX0RNQUZpcnN0RW5hYmxlZENoYW5uZWxfTWFzayk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX0dldEZsYWdTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEFEQyBmbGFnIGlzIHNldCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBBRENfRkxBRzogc3BlY2lmaWVzIHRoZSBBREMgZmxhZyB0byBjaGVjay4gVGhpcyBwYXJhbWV0ZXIgDQoqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19GTEFHX0VDSDogIEVuZCBvZiBjaGFpbiBjb252ZXJzaW9uIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRkxBR19FT0M6ICBFbmQgb2YgY2hhbm5lbCBjb252ZXJzaW9uIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRkxBR19KRUNIOiBFbmQgb2YgaW5qZWN0ZWQgY2hhaW4gY29udmVyc2lvbiBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfSkVPQzogRW5kIG9mIGluamVjdGVkIGNoYW5uZWwgY29udmVyc2lvbiBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfQW5hbG9nV2F0Y2hkb2cwX0xvd1RocmVzaG9sZDogIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyAwIExvd1RocmVzaG9sZCBGbGFnICAgICAgICANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRkxBR19BbmFsb2dXYXRjaGRvZzBfSGlnaFRocmVzaG9sZDogDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDAgSGlnaFRocmVzaG9sZCBGbGFnIAkNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRkxBR19BbmFsb2dXYXRjaGRvZzFfTG93VGhyZXNob2xkOiAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDEgTG93VGhyZXNob2xkIEZsYWcgIAkNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRkxBR19BbmFsb2dXYXRjaGRvZzFfSGlnaFRocmVzaG9sZDogDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDEgSGlnaFRocmVzaG9sZCBGbGFnICAJDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfQW5hbG9nV2F0Y2hkb2cyX0xvd1RocmVzaG9sZDogIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyAyIExvd1RocmVzaG9sZCBGbGFnICAJDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfQW5hbG9nV2F0Y2hkb2cyX0hpZ2hUaHJlc2hvbGQ6IA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyAyIEhpZ2hUaHJlc2hvbGQgRmxhZyAJDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfQW5hbG9nV2F0Y2hkb2czX0xvd1RocmVzaG9sZDogIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyAzIExvd1RocmVzaG9sZCBGbGFnICAJDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfQW5hbG9nV2F0Y2hkb2czX0hpZ2hUaHJlc2hvbGQ6IA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyAzIEhpZ2hUaHJlc2hvbGQgRmxhZyANCiogT3V0cHV0ICAgICAgICAgOiBOb25lCQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgdGhlIEFEQ19GTEFHIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgQURDX0dldEZsYWdTdGF0dXModTE2IEFEQ19GTEFHKQ0Kew0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgQURDIGZsYWcgKi8NCiAgaWYoKEFEQy0+UEJSICYgQURDX0ZMQUcpICE9IFJFU0VUKQ0KICB7DQogICAgLyogUmV0dXJuIFNFVCBpZiBBRENfRkxBRyBpcyBzZXQgKi8NCiAgICByZXR1cm4gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFJldHVybiBSRVNFVCBpZiBBRENfRkxBRyBpcyByZXNldCAqLw0KICAgIHJldHVybiBSRVNFVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19DbGVhckZsYWcNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIEFEQ5JzIHBlbmRpbmcgZmxhZ3MuICANCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuIFRoaXMgcGFyYW1ldGVyIGNhbiANCiogICAgICAgICAgICAgICAgICAgIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRkxBR19FQ0g6ICBFbmQgb2YgY2hhaW4gY29udmVyc2lvbiBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfRU9DOiAgRW5kIG9mIGNoYW5uZWwgY29udmVyc2lvbiBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfSkVDSDogSW5qZWN0ZWQgZW5kIG9mIGNoYWluIGNvbnZlcnNpb24gZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19GTEFHX0pFT0M6IEluamVjdGVkIGVuZCBvZiBjaGFubmVsIGNvbnZlcnNpb24gZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19GTEFHX0FuYWxvZ1dhdGNoZG9nMF9Mb3dUaHJlc2hvbGQ6ICANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyAwIExvd1RocmVzaG9sZCBmbGFnICAgICAgICANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRkxBR19BbmFsb2dXYXRjaGRvZzBfSGlnaFRocmVzaG9sZDogDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2cgV2F0Y2hkb2cgMCBIaWdoVGhyZXNob2xkIGZsYWcgCQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19GTEFHX0FuYWxvZ1dhdGNoZG9nMV9Mb3dUaHJlc2hvbGQ6ICANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyAxIExvd1RocmVzaG9sZCBmbGFnICAJDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfQW5hbG9nV2F0Y2hkb2cxX0hpZ2hUaHJlc2hvbGQ6IA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDEgSGlnaFRocmVzaG9sZCBmbGFnICAJDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfQW5hbG9nV2F0Y2hkb2cyX0xvd1RocmVzaG9sZDogIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDIgTG93VGhyZXNob2xkIGZsYWcgIAkNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRkxBR19BbmFsb2dXYXRjaGRvZzJfSGlnaFRocmVzaG9sZDogDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2cgV2F0Y2hkb2cgMiBIaWdoVGhyZXNob2xkIGZsYWcgCQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19GTEFHX0FuYWxvZ1dhdGNoZG9nM19Mb3dUaHJlc2hvbGQ6ICANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyAzIExvd1RocmVzaG9sZCBmbGFnICAJDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfQW5hbG9nV2F0Y2hkb2czX0hpZ2hUaHJlc2hvbGQ6IA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDMgSGlnaFRocmVzaG9sZCBmbGFnICAJDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19DbGVhckZsYWcodTE2IEFEQ19GTEFHKQ0Kew0KICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgQURDIGZsYWcgKi8gDQogIEFEQy0+UEJSID0gQURDX0ZMQUc7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX0dldElUU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBBREMgaW50ZXJydXB0IGhhcyBvY2N1cmVkIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ19JVDogc3BlY2lmaWVzIHRoZSBBREMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4gVGhpcyANCiogICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9FQ0ggOkVuZCBvZiBjaGFpbiBjb252ZXJzaW9uIGludGVycnVwdCANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfRU9DIDpFbmQgb2YgY2hhbm5lbCBjb252ZXJzaW9uIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9KRUNIIDpFbmQgb2YgaW5qZWN0ZWQgY2hhaW4gY29udmVyc2lvbiBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfSkVPQyA6RW5kIG9mIGluamVjdGVkIGNoYW5uZWwgY29udmVyc2lvbiBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfQW5hbG9nV2F0Y2hkb2cwX0xvd1RocmVzaG9sZDogIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDAgTG93VGhyZXNob2xkIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9BbmFsb2dXYXRjaGRvZzBfSGlnaFRocmVzaG9sZDogDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2cgV2F0Y2hkb2cgMCBIaWdoVGhyZXNob2xkIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9BbmFsb2dXYXRjaGRvZzFfTG93VGhyZXNob2xkOiAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2cgV2F0Y2hkb2cgMSBMb3dUaHJlc2hvbGQgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0FuYWxvZ1dhdGNoZG9nMV9IaWdoVGhyZXNob2xkOiANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyAxIEhpZ2hUaHJlc2hvbGQgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0FuYWxvZ1dhdGNoZG9nMl9Mb3dUaHJlc2hvbGQ6ICANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyAyIExvd1RocmVzaG9sZCBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfQW5hbG9nV2F0Y2hkb2cyX0hpZ2hUaHJlc2hvbGQ6IA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDIgSGlnaFRocmVzaG9sZCBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfQW5hbG9nV2F0Y2hkb2czX0xvd1RocmVzaG9sZDogIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDMgTG93VGhyZXNob2xkIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9BbmFsb2dXYXRjaGRvZzNfSGlnaFRocmVzaG9sZDogDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2cgV2F0Y2hkb2cgMyBIaWdoVGhyZXNob2xkIGludGVycnVwdA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUJDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiB0aGUgQURDX0lUIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIEFEQ19HZXRJVFN0YXR1cyh1MTYgQURDX0lUKQ0Kew0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgQURDIGludGVycnVwdCAqLw0KICBpZigoQURDLT5QQlIgJiBBRENfSVQpICE9IFJFU0VUKQ0KICB7DQogICAgLyogUmV0dXJuIFNFVCBpZiB0aGUgQURDIGludGVycnVwdCBmbGFnIGlzIHNldCAqLw0KICAgIHJldHVybiBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmV0dXJuIFJFU0VUIGlmIHRoZSBBREMgaW50ZXJydXB0IGZsYWcgaXMgcmVzZXQgKi8NCiAgICByZXR1cm4gUkVTRVQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfQ2xlYXJJVFBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIEFEQ5JzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuICANCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ19JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuIFRoaXMgDQoqICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgY2FuIGJlIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyANCiogICAgICAgICAgICAgICAgICAgIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfRUNIOiAgRW5kIG9mIGNoYWluIGNvbnZlcnNpb24gaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0VPQzogIEVuZCBvZiBjaGFubmVsIGNvbnZlcnNpb24gaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0pFQ0g6IEluamVjdGVkIGVuZCBvZiBjaGFpbiBjb252ZXJzaW9uIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9KRU9DOiBJbmplY3RlZCBlbmQgb2YgY2hhbm5lbCBjb252ZXJzaW9uIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9BbmFsb2dXYXRjaGRvZzBfTG93VGhyZXNob2xkOiAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2cgV2F0Y2hkb2cgMCBMb3dUaHJlc2hvbGQgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0FuYWxvZ1dhdGNoZG9nMF9IaWdoVGhyZXNob2xkOiANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyAwIEhpZ2hUaHJlc2hvbGQgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0FuYWxvZ1dhdGNoZG9nMV9Mb3dUaHJlc2hvbGQ6ICANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyAxIExvd1RocmVzaG9sZCBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfQW5hbG9nV2F0Y2hkb2cxX0hpZ2hUaHJlc2hvbGQ6IA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDEgSGlnaFRocmVzaG9sZCBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfQW5hbG9nV2F0Y2hkb2cyX0xvd1RocmVzaG9sZDogIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nIFdhdGNoZG9nIDIgTG93VGhyZXNob2xkIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9BbmFsb2dXYXRjaGRvZzJfSGlnaFRocmVzaG9sZDogDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2cgV2F0Y2hkb2cgMiBIaWdoVGhyZXNob2xkIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9BbmFsb2dXYXRjaGRvZzNfTG93VGhyZXNob2xkOiAgDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2cgV2F0Y2hkb2cgMyBMb3dUaHJlc2hvbGQgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0FuYWxvZ1dhdGNoZG9nM19IaWdoVGhyZXNob2xkOiANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWxvZyBXYXRjaGRvZyA1IEhpZ2hUaHJlc2hvbGQgaW50ZXJydXB0DQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19DbGVhcklUUGVuZGluZ0JpdCh1MTYgQURDX0lUKQ0Kew0KICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgQURDIGludGVycnVwdHMgcGVuZGluZyBiaXRzICovDQogIEFEQy0+UEJSID0gQURDX0lUOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDYgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K