LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X2RtYS5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDA5LzI5LzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgRE1BIGZpcm13YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA0LzAyLzIwMDc6IFYwLjINCiogMDIvMDUvMjAwNzogVjAuMQ0KKiAwOS8yOS8yMDA2OiBWMC4wMQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVEhFIFBSRVNFTlQgU09GVFdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQoqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFIFRJTUUuDQoqIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkgRElSRUNULA0KKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORyBGUk9NIFRIRQ0KKiBDT05URU5UIE9GIFNVQ0ggU09GVFdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFIENPRElORw0KKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMTB4X2RtYS5oIg0KI2luY2x1ZGUgInN0bTMyZjEweF9yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBETUEgRU5BQkxFIG1hc2sgKi8NCiNkZWZpbmUgQ0NSX0VOQUJMRV9TZXQgICAgICAgICAgKCh1MzIpMHgwMDAwMDAwMSkNCiNkZWZpbmUgQ0NSX0VOQUJMRV9SZXNldCAgICAgICAgKCh1MzIpMHhGRkZGRkZGRSkNCg0KLyogRE1BIENoYW5uZWx4IGludGVycnVwdCBwZW5kaW5nIGJpdCBtYXNrcyAqLw0KI2RlZmluZSBETUFfQ2hhbm5lbDFfSVRfTWFzayAgICAoKHUzMikweDAwMDAwMDBGKQ0KI2RlZmluZSBETUFfQ2hhbm5lbDJfSVRfTWFzayAgICAoKHUzMikweDAwMDAwMEYwKQ0KI2RlZmluZSBETUFfQ2hhbm5lbDNfSVRfTWFzayAgICAoKHUzMikweDAwMDAwRjAwKQ0KI2RlZmluZSBETUFfQ2hhbm5lbDRfSVRfTWFzayAgICAoKHUzMikweDAwMDBGMDAwKQ0KI2RlZmluZSBETUFfQ2hhbm5lbDVfSVRfTWFzayAgICAoKHUzMikweDAwMEYwMDAwKQ0KI2RlZmluZSBETUFfQ2hhbm5lbDZfSVRfTWFzayAgICAoKHUzMikweDAwRjAwMDAwKQ0KI2RlZmluZSBETUFfQ2hhbm5lbDdfSVRfTWFzayAgICAoKHUzMikweDBGMDAwMDAwKQ0KDQovKiBETUEgcmVnaXN0ZXJzIE1hc2tzICovDQojZGVmaW5lIENDUl9DTEVBUl9NYXNrICAgICAgICAgICgodTMyKTB4RkZGRjgwMEYpDQoNCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogRE1BX0RlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IERlaW5pdGlhbGl6ZXMgdGhlIERNQSBDaGFubmVseCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldA0KKiAgICAgICAgICAgICAgICAgIHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiAtIERNQV9DaGFubmVseDogd2hlcmUgeCBjYW4gYmUgMSwgMiB0byA3IHRvIHNlbGVjdCB0aGUgRE1BDQoqICAgICAgICAgICAgICAgICAgICBDaGFubmVsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBETUFfRGVJbml0KERNQV9DaGFubmVsX1R5cGVEZWYqIERNQV9DaGFubmVseCkNCnsNCiAgLyogRE1BIENoYW5uZWx4IGRpc2FibGUgKi8NCiAgRE1BX0NtZChETUFfQ2hhbm5lbHgsIERJU0FCTEUpOw0KDQogIC8qIFJlc2V0IENoYW5uZWx4IGNvbnRyb2wgcmVnaXN0ZXIgKi8NCiAgRE1BX0NoYW5uZWx4LT5DQ1IgID0gMDsNCiAgDQogIC8qIFJlc2V0IENoYW5uZWx4IHJlbWFpbmluZyBieXRlcyByZWdpc3RlciAqLw0KICBETUFfQ2hhbm5lbHgtPkNORFRSID0gMDsNCiAgDQogIC8qIFJlc2V0IENoYW5uZWx4IHBlcmlwaGVyYWwgYWRkcmVzcyByZWdpc3RlciAqLw0KICBETUFfQ2hhbm5lbHgtPkNQQVIgID0gMDsNCiAgDQogIC8qIFJlc2V0IENoYW5uZWx4IG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyICovDQogIERNQV9DaGFubmVseC0+Q01BUiA9IDA7DQoNCiAgc3dpdGNoICgqKHUzMiopJkRNQV9DaGFubmVseCkNCiAgew0KICAgIGNhc2UgRE1BX0NoYW5uZWwxX0JBU0U6DQogICAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBDaGFubmVsMSAqLw0KICAgICAgRE1BLT5JRkNSIHw9IERNQV9DaGFubmVsMV9JVF9NYXNrOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIERNQV9DaGFubmVsMl9CQVNFOg0KICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgQ2hhbm5lbDIgKi8NCiAgICAgIERNQS0+SUZDUiB8PSBETUFfQ2hhbm5lbDJfSVRfTWFzazsNCiAgICAgIGJyZWFrOw0KDQogICAgY2FzZSBETUFfQ2hhbm5lbDNfQkFTRToNCiAgICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIENoYW5uZWwzICovDQogICAgICBETUEtPklGQ1IgfD0gRE1BX0NoYW5uZWwzX0lUX01hc2s7DQogICAgICBicmVhazsNCg0KICAgIGNhc2UgRE1BX0NoYW5uZWw0X0JBU0U6DQogICAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBDaGFubmVsNCAqLw0KICAgICAgRE1BLT5JRkNSIHw9IERNQV9DaGFubmVsNF9JVF9NYXNrOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIERNQV9DaGFubmVsNV9CQVNFOg0KICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgQ2hhbm5lbDUgKi8NCiAgICAgIERNQS0+SUZDUiB8PSBETUFfQ2hhbm5lbDVfSVRfTWFzazsNCiAgICAgIGJyZWFrOw0KDQogICAgY2FzZSBETUFfQ2hhbm5lbDZfQkFTRToNCiAgICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIENoYW5uZWw2ICovDQogICAgICBETUEtPklGQ1IgfD0gRE1BX0NoYW5uZWw2X0lUX01hc2s7DQogICAgICBicmVhazsNCg0KICAgIGNhc2UgRE1BX0NoYW5uZWw3X0JBU0U6DQogICAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBDaGFubmVsNyAqLw0KICAgICAgRE1BLT5JRkNSIHw9IERNQV9DaGFubmVsN19JVF9NYXNrOw0KICAgICAgYnJlYWs7DQoNCiAgICBkZWZhdWx0Og0KICAgICAgYnJlYWs7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBETUFfSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBETUEgQ2hhbm5lbHggYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBETUFfSW5pdFN0cnVjdC4NCiogSW5wdXQgICAgICAgICAgOiAtIERNQV9DaGFubmVseDogd2hlcmUgeCBjYW4gYmUgMSwgMiB0byA3IHRvIHNlbGVjdCB0aGUgRE1BDQoqICAgICAgICAgICAgICAgICAgICBDaGFubmVsLg0KKiAgICAgICAgICAgICAgICAgIC0gRE1BX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBETUFfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCiogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgICBETUEgQ2hhbm5lbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBETUFfSW5pdChETUFfQ2hhbm5lbF9UeXBlRGVmKiBETUFfQ2hhbm5lbHgsIERNQV9Jbml0VHlwZURlZiogRE1BX0luaXRTdHJ1Y3QpDQp7DQogIHUzMiB0bXByZWcgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19ETUFfRElSKERNQV9Jbml0U3RydWN0LT5ETUFfRElSKSk7DQogIGFzc2VydChJU19ETUFfQlVGRkVSX1NJWkUoRE1BX0luaXRTdHJ1Y3QtPkRNQV9CdWZmZXJTaXplKSk7CSAgIA0KICBhc3NlcnQoSVNfRE1BX1BFUklQSEVSQUxfSU5DX1NUQVRFKERNQV9Jbml0U3RydWN0LT5ETUFfUGVyaXBoZXJhbEluYykpOyAgDQogIGFzc2VydChJU19ETUFfTUVNT1JZX0lOQ19TVEFURShETUFfSW5pdFN0cnVjdC0+RE1BX01lbW9yeUluYykpOyAgIA0KICBhc3NlcnQoSVNfRE1BX1BFUklQSEVSQUxfREFUQV9TSVpFKERNQV9Jbml0U3RydWN0LT5ETUFfUGVyaXBoZXJhbERhdGFTaXplKSk7DQogIGFzc2VydChJU19ETUFfTUVNT1JZX0RBVEFfU0laRShETUFfSW5pdFN0cnVjdC0+RE1BX01lbW9yeURhdGFTaXplKSk7DQogIGFzc2VydChJU19ETUFfTU9ERShETUFfSW5pdFN0cnVjdC0+RE1BX01vZGUpKTsNCiAgYXNzZXJ0KElTX0RNQV9QUklPUklUWShETUFfSW5pdFN0cnVjdC0+RE1BX1ByaW9yaXR5KSk7DQogIGFzc2VydChJU19ETUFfTTJNX1NUQVRFKERNQV9Jbml0U3RydWN0LT5ETUFfTTJNKSk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERNQSBDaGFubmVseCBDQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIEdldCB0aGUgRE1BX0NoYW5uZWx4IENDUiB2YWx1ZSAqLw0KICB0bXByZWcgPSBETUFfQ2hhbm5lbHgtPkNDUjsNCiAgLyogQ2xlYXIgTUVNMk1FTSwgUEwsIE1TSVpFLCBQU0laRSwgTUlOQywgUElOQywgQ0lSQ1VMQVIgYW5kIERJUiBiaXRzICovDQogIHRtcHJlZyAmPSBDQ1JfQ0xFQVJfTWFzazsNCiAgLyogQ29uZmlndXJlIERNQSBDaGFubmVseDogZGF0YSB0cmFuc2ZlciwgZGF0YSBzaXplLCBwcmlvcml0eSBsZXZlbCBhbmQgbW9kZSAqLw0KICAvKiBTZXQgRElSIGJpdCBhY2NvcmRpbmcgdG8gRE1BX0RJUiB2YWx1ZSAqLw0KICAvKiBTZXQgQ0lSQ1VMQVIgYml0IGFjY29yZGluZyB0byBETUFfTW9kZSB2YWx1ZSAqLw0KICAvKiBTZXQgUElOQyBiaXQgYWNjb3JkaW5nIHRvIERNQV9QZXJpcGhlcmFsSW5jIHZhbHVlICovDQogIC8qIFNldCBNSU5DIGJpdCBhY2NvcmRpbmcgdG8gRE1BX01lbW9yeUluYyB2YWx1ZSAqLw0KICAvKiBTZXQgUFNJWkUgYml0cyBhY2NvcmRpbmcgdG8gRE1BX1BlcmlwaGVyYWxEYXRhU2l6ZSB2YWx1ZSAqLw0KICAvKiBTZXQgTVNJWkUgYml0cyBhY2NvcmRpbmcgdG8gRE1BX01lbW9yeURhdGFTaXplIHZhbHVlICovDQogIC8qIFNldCBQTCBiaXRzIGFjY29yZGluZyB0byBETUFfUHJpb3JpdHkgdmFsdWUgKi8NCiAgLyogU2V0IHRoZSBNRU0yTUVNIGJpdCBhY2NvcmRpbmcgdG8gRE1BX00yTSB2YWx1ZSAqLw0KICB0bXByZWcgfD0gRE1BX0luaXRTdHJ1Y3QtPkRNQV9ESVIgfCBETUFfSW5pdFN0cnVjdC0+RE1BX01vZGUgfA0KICAgICAgICAgICAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9QZXJpcGhlcmFsSW5jIHwgRE1BX0luaXRTdHJ1Y3QtPkRNQV9NZW1vcnlJbmMgfA0KICAgICAgICAgICAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9QZXJpcGhlcmFsRGF0YVNpemUgfCBETUFfSW5pdFN0cnVjdC0+RE1BX01lbW9yeURhdGFTaXplIHwNCiAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5ETUFfUHJpb3JpdHkgfCBETUFfSW5pdFN0cnVjdC0+RE1BX00yTTsNCiAgLyogV3JpdGUgdG8gRE1BIENoYW5uZWx4IENDUiAqLw0KICBETUFfQ2hhbm5lbHgtPkNDUiA9IHRtcHJlZzsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BIENoYW5uZWx4IENOQlRSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogV3JpdGUgdG8gRE1BIENoYW5uZWx4IENOQlRSICovDQogIERNQV9DaGFubmVseC0+Q05EVFIgPSBETUFfSW5pdFN0cnVjdC0+RE1BX0J1ZmZlclNpemU7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERNQSBDaGFubmVseCBDUEFSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIFdyaXRlIHRvIERNQSBDaGFubmVseCBDUEFSICovDQogIERNQV9DaGFubmVseC0+Q1BBUiA9IERNQV9Jbml0U3RydWN0LT5ETUFfUGVyaXBoZXJhbEJhc2VBZGRyOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBETUEgQ2hhbm5lbHggQ01BUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBXcml0ZSB0byBETUEgQ2hhbm5lbHggQ01BUiAqLw0KICBETUFfQ2hhbm5lbHgtPkNNQVIgPSBETUFfSW5pdFN0cnVjdC0+RE1BX01lbW9yeUJhc2VBZGRyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IERNQV9TdHJ1Y3RJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRmlsbHMgZWFjaCBETUFfSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIERNQV9Jbml0U3RydWN0IDogcG9pbnRlciB0byBhIERNQV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiogICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIERNQV9TdHJ1Y3RJbml0KERNQV9Jbml0VHlwZURlZiogRE1BX0luaXRTdHJ1Y3QpDQp7DQovKi0tLS0tLS0tLS0tLS0tIFJlc2V0IERNQSBpbml0IHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHZhbHVlcyAtLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBJbml0aWFsaXplIHRoZSBETUFfUGVyaXBoZXJhbEJhc2VBZGRyIG1lbWJlciAqLw0KICBETUFfSW5pdFN0cnVjdC0+RE1BX1BlcmlwaGVyYWxCYXNlQWRkciA9IDA7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BX01lbW9yeUJhc2VBZGRyIG1lbWJlciAqLw0KICBETUFfSW5pdFN0cnVjdC0+RE1BX01lbW9yeUJhc2VBZGRyID0gMDsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBETUFfRElSIG1lbWJlciAqLw0KICBETUFfSW5pdFN0cnVjdC0+RE1BX0RJUiA9IERNQV9ESVJfUGVyaXBoZXJhbFNSQzsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBETUFfQnVmZmVyU2l6ZSBtZW1iZXIgKi8NCiAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9CdWZmZXJTaXplID0gMDsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBETUFfUGVyaXBoZXJhbEluYyBtZW1iZXIgKi8NCiAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9QZXJpcGhlcmFsSW5jID0gRE1BX1BlcmlwaGVyYWxJbmNfRGlzYWJsZTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBETUFfTWVtb3J5SW5jIG1lbWJlciAqLw0KICBETUFfSW5pdFN0cnVjdC0+RE1BX01lbW9yeUluYyA9IERNQV9NZW1vcnlJbmNfRGlzYWJsZTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBETUFfUGVyaXBoZXJhbERhdGFTaXplIG1lbWJlciAqLw0KICBETUFfSW5pdFN0cnVjdC0+RE1BX1BlcmlwaGVyYWxEYXRhU2l6ZSA9IERNQV9QZXJpcGhlcmFsRGF0YVNpemVfQnl0ZTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBETUFfTWVtb3J5RGF0YVNpemUgbWVtYmVyICovDQogIERNQV9Jbml0U3RydWN0LT5ETUFfTWVtb3J5RGF0YVNpemUgPSBETUFfTWVtb3J5RGF0YVNpemVfQnl0ZTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBETUFfTW9kZSBtZW1iZXIgKi8NCiAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9Nb2RlID0gRE1BX01vZGVfTm9ybWFsOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIERNQV9Qcmlvcml0eSBtZW1iZXIgKi8NCiAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9Qcmlvcml0eSA9IERNQV9Qcmlvcml0eV9Mb3c7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BX00yTSBtZW1iZXIgKi8NCiAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9NMk0gPSBETUFfTTJNX0Rpc2FibGU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogRE1BX0NtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4NCiogSW5wdXQgICAgICAgICAgOiAtIERNQV9DaGFubmVseDogd2hlcmUgeCBjYW4gYmUgMSwgMiB0byA3IHRvIHNlbGVjdCB0aGUgRE1BDQoqICAgICAgICAgICAgICAgICAgICBDaGFubmVsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRE1BeCBDaGFubmVsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIERNQV9DbWQoRE1BX0NoYW5uZWxfVHlwZURlZiogIERNQV9DaGFubmVseCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBETUEgQ2hhbm5lbHggKi8NCiAgICBETUFfQ2hhbm5lbHgtPkNDUiB8PSBDQ1JfRU5BQkxFX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBETUEgQ2hhbm5lbHggKi8NCiAgICBETUFfQ2hhbm5lbHgtPkNDUiAmPSBDQ1JfRU5BQkxFX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogRE1BX0lUQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIERNQSBpbnRlcnJ1cHRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gRE1BX0lUOiBzcGVjaWZpZXMgdGhlIERNQSBpbnRlcnJ1cHRzIHNvdXJjZXMgdG8gYmUgZW5hYmxlZA0KKiAgICAgICAgICAgICAgICAgICAgb3IgZGlzYWJsZWQuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX1RDOiAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sNCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX0hUOiAgSGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQgbWFzaw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEU6ICBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgbWFzaw0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIERNQSBpbnRlcnJ1cHRzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgRE1BX0lUQ29uZmlnKERNQV9DaGFubmVsX1R5cGVEZWYqIERNQV9DaGFubmVseCwgdTMyIERNQV9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRE1BX0NPTkZJR19JVChETUFfSVQpKTsNCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgRE1BIGludGVycnVwdHMgKi8NCiAgICBETUFfQ2hhbm5lbHgtPkNDUiB8PSBETUFfSVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgRE1BIGludGVycnVwdHMgKi8NCiAgICBETUFfQ2hhbm5lbHgtPkNDUiAmPSB+RE1BX0lUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogRE1BX0dldEN1cnJEYXRhQ291bnRlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybnMgdGhlIG51bWJlciBvZiByZW1haW5pbmcgZGF0YSB1bml0cyBpbiB0aGUgY3VycmVudA0KKiAgICAgICAgICAgICAgICAgIERNQSBDaGFubmVsIHRyYW5zZmVyLg0KKiBJbnB1dCAgICAgICAgICA6IC0gRE1BX0NoYW5uZWx4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIHRvIDcgdG8gc2VsZWN0IHRoZSBETUENCiogICAgICAgICAgICAgICAgICAgIENoYW5uZWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGRhdGEgdW5pdHMgaW4gdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwNCiogICAgICAgICAgICAgICAgICB0cmFuc2Zlci4uDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IERNQV9HZXRDdXJyRGF0YUNvdW50ZXIoRE1BX0NoYW5uZWxfVHlwZURlZiogIERNQV9DaGFubmVseCkNCnsNCiAgLyogUmV0dXJuIHRoZSBjdXJyZW50IG1lbW9yeSBhZGRyZXNzIHZhbHVlIGZvciBDaGFubmVseCAqLw0KICByZXR1cm4gKCh1MTYpKERNQV9DaGFubmVseC0+Q05EVFIpKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBETUFfR2V0RmxhZ1N0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRE1BIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIERNQV9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfR0wxOiBDaGFubmVsMSBnbG9iYWwgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfVEMxOiBDaGFubmVsMSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19IVDE6IENoYW5uZWwxIGhhbGYgdHJhbnNmZXIgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfVEUxOiBDaGFubmVsMSB0cmFuc2ZlciBlcnJvciBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19HTDI6IENoYW5uZWwyIGdsb2JhbCBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19UQzI6IENoYW5uZWwyIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX0hUMjogQ2hhbm5lbDIgaGFsZiB0cmFuc2ZlciBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19URTI6IENoYW5uZWwyIHRyYW5zZmVyIGVycm9yIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX0dMMzogQ2hhbm5lbDMgZ2xvYmFsIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX1RDMzogQ2hhbm5lbDMgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfSFQzOiBDaGFubmVsMyBoYWxmIHRyYW5zZmVyIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX1RFMzogQ2hhbm5lbDMgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfR0w0OiBDaGFubmVsNCBnbG9iYWwgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfVEM0OiBDaGFubmVsNCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19IVDQ6IENoYW5uZWw0IGhhbGYgdHJhbnNmZXIgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfVEU0OiBDaGFubmVsNCB0cmFuc2ZlciBlcnJvciBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19HTDU6IENoYW5uZWw1IGdsb2JhbCBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19UQzU6IENoYW5uZWw1IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX0hUNTogQ2hhbm5lbDUgaGFsZiB0cmFuc2ZlciBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19URTU6IENoYW5uZWw1IHRyYW5zZmVyIGVycm9yIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX0dMNjogQ2hhbm5lbDYgZ2xvYmFsIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX1RDNjogQ2hhbm5lbDYgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfSFQ2OiBDaGFubmVsNiBoYWxmIHRyYW5zZmVyIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX1RFNjogQ2hhbm5lbDYgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfR0w3OiBDaGFubmVsNyBnbG9iYWwgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfVEM3OiBDaGFubmVsNyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19IVDc6IENoYW5uZWw3IGhhbGYgdHJhbnNmZXIgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfVEU3OiBDaGFubmVsNyB0cmFuc2ZlciBlcnJvciBmbGFnLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIERNQV9GTEFHIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgRE1BX0dldEZsYWdTdGF0dXModTMyIERNQV9GTEFHKQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19ETUFfR0VUX0ZMQUcoRE1BX0ZMQUcpKTsNCg0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgRE1BIGZsYWcgKi8NCiAgaWYgKChETUEtPklTUiAmIERNQV9GTEFHKSAhPSAodTMyKVJFU0VUKQ0KICB7DQogICAgLyogRE1BX0ZMQUcgaXMgc2V0ICovDQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERNQV9GTEFHIGlzIHJlc2V0ICovDQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBETUFfRkxBRyBzdGF0dXMgKi8NCiAgcmV0dXJuICBiaXRzdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogRE1BX0NsZWFyRmxhZw0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgRE1BJ3MgcGVuZGluZyBmbGFncy4NCiogSW5wdXQgICAgICAgICAgOiAtIERNQV9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfR0wxOiBDaGFubmVsMSBnbG9iYWwgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfVEMxOiBDaGFubmVsMSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19IVDE6IENoYW5uZWwxIGhhbGYgdHJhbnNmZXIgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfVEUxOiBDaGFubmVsMSB0cmFuc2ZlciBlcnJvciBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19HTDI6IENoYW5uZWwyIGdsb2JhbCBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19UQzI6IENoYW5uZWwyIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX0hUMjogQ2hhbm5lbDIgaGFsZiB0cmFuc2ZlciBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19URTI6IENoYW5uZWwyIHRyYW5zZmVyIGVycm9yIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX0dMMzogQ2hhbm5lbDMgZ2xvYmFsIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX1RDMzogQ2hhbm5lbDMgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfSFQzOiBDaGFubmVsMyBoYWxmIHRyYW5zZmVyIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX1RFMzogQ2hhbm5lbDMgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfR0w0OiBDaGFubmVsNCBnbG9iYWwgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfVEM0OiBDaGFubmVsNCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19IVDQ6IENoYW5uZWw0IGhhbGYgdHJhbnNmZXIgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfVEU0OiBDaGFubmVsNCB0cmFuc2ZlciBlcnJvciBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19HTDU6IENoYW5uZWw1IGdsb2JhbCBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19UQzU6IENoYW5uZWw1IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX0hUNTogQ2hhbm5lbDUgaGFsZiB0cmFuc2ZlciBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19URTU6IENoYW5uZWw1IHRyYW5zZmVyIGVycm9yIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX0dMNjogQ2hhbm5lbDYgZ2xvYmFsIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX1RDNjogQ2hhbm5lbDYgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfSFQ2OiBDaGFubmVsNiBoYWxmIHRyYW5zZmVyIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9GTEFHX1RFNjogQ2hhbm5lbDYgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfR0w3OiBDaGFubmVsNyBnbG9iYWwgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfVEM3OiBDaGFubmVsNyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfRkxBR19IVDc6IENoYW5uZWw3IGhhbGYgdHJhbnNmZXIgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0ZMQUdfVEU3OiBDaGFubmVsNyB0cmFuc2ZlciBlcnJvciBmbGFnLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBETUFfQ2xlYXJGbGFnKHUzMiBETUFfRkxBRykNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0RNQV9DTEVBUl9GTEFHKERNQV9GTEFHKSk7DQoNCiAgLyogQ2xlYXIgdGhlIHNlbGVjdGVkIERNQSBmbGFncyAqLw0KICBETUEtPklGQ1IgPSBETUFfRkxBRzsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBETUFfR2V0SVRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIERNQSBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIERNQV9JVDogc3BlY2lmaWVzIHRoZSBETUEgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfR0wxOiBDaGFubmVsMSBnbG9iYWwgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEMxOiBDaGFubmVsMSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9IVDE6IENoYW5uZWwxIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEUxOiBDaGFubmVsMSB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9HTDI6IENoYW5uZWwyIGdsb2JhbCBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9UQzI6IENoYW5uZWwyIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX0hUMjogQ2hhbm5lbDIgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9URTI6IENoYW5uZWwyIHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX0dMMzogQ2hhbm5lbDMgZ2xvYmFsIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX1RDMzogQ2hhbm5lbDMgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfSFQzOiBDaGFubmVsMyBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX1RFMzogQ2hhbm5lbDMgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfR0w0OiBDaGFubmVsNCBnbG9iYWwgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEM0OiBDaGFubmVsNCB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9IVDQ6IENoYW5uZWw0IGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEU0OiBDaGFubmVsNCB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9HTDU6IENoYW5uZWw1IGdsb2JhbCBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9UQzU6IENoYW5uZWw1IHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX0hUNTogQ2hhbm5lbDUgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9URTU6IENoYW5uZWw1IHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX0dMNjogQ2hhbm5lbDYgZ2xvYmFsIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX1RDNjogQ2hhbm5lbDYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfSFQ2OiBDaGFubmVsNiBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX1RFNjogQ2hhbm5lbDYgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfR0w3OiBDaGFubmVsNyBnbG9iYWwgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEM3OiBDaGFubmVsNyB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9IVDc6IENoYW5uZWw3IGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEU3OiBDaGFubmVsNyB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgRE1BX0lUIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIERNQV9HZXRJVFN0YXR1cyh1MzIgRE1BX0lUKQ0Kew0KICBJVFN0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRE1BX0dFVF9JVChETUFfSVQpKTsNCg0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgRE1BIGludGVycnVwdCAqLw0KICBpZiAoKERNQS0+SVNSICYgRE1BX0lUKSAhPSAodTMyKVJFU0VUKQ0KICB7DQogICAgLyogRE1BX0lUIGlzIHNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBETUFfSVQgaXMgcmVzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICAvKiBSZXR1cm4gdGhlIERNQV9JVCBzdGF0dXMgKi8NCiAgcmV0dXJuICBiaXRzdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogRE1BX0NsZWFySVRQZW5kaW5nQml0DQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBETUGScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gRE1BX0lUOiBzcGVjaWZpZXMgdGhlIERNQSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfR0wxOiBDaGFubmVsMSBnbG9iYWwgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEMxOiBDaGFubmVsMSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9IVDE6IENoYW5uZWwxIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEUxOiBDaGFubmVsMSB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9HTDI6IENoYW5uZWwyIGdsb2JhbCBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9UQzI6IENoYW5uZWwyIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX0hUMjogQ2hhbm5lbDIgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9URTI6IENoYW5uZWwyIHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX0dMMzogQ2hhbm5lbDMgZ2xvYmFsIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX1RDMzogQ2hhbm5lbDMgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfSFQzOiBDaGFubmVsMyBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX1RFMzogQ2hhbm5lbDMgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfR0w0OiBDaGFubmVsNCBnbG9iYWwgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEM0OiBDaGFubmVsNCB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9IVDQ6IENoYW5uZWw0IGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEU0OiBDaGFubmVsNCB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9HTDU6IENoYW5uZWw1IGdsb2JhbCBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9UQzU6IENoYW5uZWw1IHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX0hUNTogQ2hhbm5lbDUgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9URTU6IENoYW5uZWw1IHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX0dMNjogQ2hhbm5lbDYgZ2xvYmFsIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX1RDNjogQ2hhbm5lbDYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfSFQ2OiBDaGFubmVsNiBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gRE1BX0lUX1RFNjogQ2hhbm5lbDYgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfR0w3OiBDaGFubmVsNyBnbG9iYWwgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEM3OiBDaGFubmVsNyB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIERNQV9JVF9IVDc6IENoYW5uZWw3IGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBETUFfSVRfVEU3OiBDaGFubmVsNyB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIERNQV9DbGVhcklUUGVuZGluZ0JpdCh1MzIgRE1BX0lUKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRE1BX0NMRUFSX0lUKERNQV9JVCkpOw0KDQogIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBETUEgaW50ZXJydXB0IHBlbmRpbmcgYml0cyAqLw0KICBETUEtPklGQ1IgPSBETUFfSVQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQoNCg==