LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X2Nhbi5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDA5LzI5LzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgQ0FOIGZpcm13YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA0LzAyLzIwMDc6IFYwLjINCiogMDIvMDUvMjAwNzogVjAuMQ0KKiAwOS8yOS8yMDA2OiBWMC4wMQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVEhFIFBSRVNFTlQgU09GVFdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQoqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFIFRJTUUuDQoqIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkgRElSRUNULA0KKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORyBGUk9NIFRIRQ0KKiBDT05URU5UIE9GIFNVQ0ggU09GVFdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFIENPRElORw0KKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMTB4X2Nhbi5oIg0KI2luY2x1ZGUgInN0bTMyZjEweF9yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIENBTiBNYXN0ZXIgQ29udHJvbCBSZWdpc3RlciBiaXRzICovDQojZGVmaW5lIENBTl9NQ1JfSU5SUSAgICAgKCh1MzIpMHgwMDAwMDAwMSkgLyogSW5pdGlhbGl6YXRpb24gcmVxdWVzdCAqLw0KI2RlZmluZSBDQU5fTUNSX1NMRUVQICAgICgodTMyKTB4MDAwMDAwMDIpIC8qIFNsZWVwIG1vZGUgcmVxdWVzdCAqLw0KI2RlZmluZSBDQU5fTUNSX1RYRlAgICAgICgodTMyKTB4MDAwMDAwMDQpIC8qIFRyYW5zbWl0IEZJRk8gcHJpb3JpdHkgKi8NCiNkZWZpbmUgQ0FOX01DUl9SRkxNICAgICAoKHUzMikweDAwMDAwMDA4KSAvKiBSZWNlaXZlIEZJRk8gbG9ja2VkIG1vZGUgKi8NCiNkZWZpbmUgQ0FOX01DUl9OQVJUICAgICAoKHUzMikweDAwMDAwMDEwKSAvKiBObyBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gKi8NCiNkZWZpbmUgQ0FOX01DUl9BV1VNICAgICAoKHUzMikweDAwMDAwMDIwKSAvKiBBdXRvbWF0aWMgd2FrZSB1cCBtb2RlICovDQojZGVmaW5lIENBTl9NQ1JfQUJPTSAgICAgKCh1MzIpMHgwMDAwMDA0MCkgLyogQXV0b21hdGljIGJ1cy1vZmYgbWFuYWdlbWVudCAqLw0KI2RlZmluZSBDQU5fTUNSX1RUQ00gICAgICgodTMyKTB4MDAwMDAwODApIC8qIHRpbWUgdHJpZ2dlcmVkIGNvbW11bmljYXRpb24gKi8NCg0KLyogQ0FOIE1hc3RlciBTdGF0dXMgUmVnaXN0ZXIgYml0cyAqLw0KI2RlZmluZSBDQU5fTVNSX0lOQUsgICAgICgodTMyKTB4MDAwMDAwMDEpICAgIC8qIEluaXRpYWxpemF0aW9uIGFja25vd2xlZGdlICovDQojZGVmaW5lIENBTl9NU1JfV0tVSSAgICAgKCh1MzIpMHgwMDAwMDAwOCkgICAgLyogV2FrZS11cCBpbnRlcnJ1cHQgKi8NCiNkZWZpbmUgQ0FOX01TUl9TTEFLSSAgICAoKHUzMikweDAwMDAwMDEwKSAgICAvKiBTbGVlcCBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8NCg0KLyogQ0FOIFRyYW5zbWl0IFN0YXR1cyBSZWdpc3RlciBiaXRzICovDQojZGVmaW5lIENBTl9UU1JfUlFDUDAgICAgKCh1MzIpMHgwMDAwMDAwMSkgICAgLyogUmVxdWVzdCBjb21wbGV0ZWQgbWFpbGJveDAgKi8NCiNkZWZpbmUgQ0FOX1RTUl9UWE9LMCAgICAoKHUzMikweDAwMDAwMDAyKSAgICAvKiBUcmFuc21pc3Npb24gT0sgb2YgbWFpbGJveDAgKi8NCiNkZWZpbmUgQ0FOX1RTUl9BQlJRMCAgICAoKHUzMikweDAwMDAwMDgwKSAgICAvKiBBYm9ydCByZXF1ZXN0IGZvciBtYWlsYm94MCAqLw0KI2RlZmluZSBDQU5fVFNSX1JRQ1AxICAgICgodTMyKTB4MDAwMDAxMDApICAgIC8qIFJlcXVlc3QgY29tcGxldGVkIG1haWxib3gxICovDQojZGVmaW5lIENBTl9UU1JfVFhPSzEgICAgKCh1MzIpMHgwMDAwMDIwMCkgICAgLyogVHJhbnNtaXNzaW9uIE9LIG9mIG1haWxib3gxICovDQojZGVmaW5lIENBTl9UU1JfQUJSUTEgICAgKCh1MzIpMHgwMDAwODAwMCkgICAgLyogQWJvcnQgcmVxdWVzdCBmb3IgbWFpbGJveDEgKi8NCiNkZWZpbmUgQ0FOX1RTUl9SUUNQMiAgICAoKHUzMikweDAwMDEwMDAwKSAgICAvKiBSZXF1ZXN0IGNvbXBsZXRlZCBtYWlsYm94MiAqLw0KI2RlZmluZSBDQU5fVFNSX1RYT0syICAgICgodTMyKTB4MDAwMjAwMDApICAgIC8qIFRyYW5zbWlzc2lvbiBPSyBvZiBtYWlsYm94MiAqLw0KI2RlZmluZSBDQU5fVFNSX0FCUlEyICAgICgodTMyKTB4MDA4MDAwMDApICAgIC8qIEFib3J0IHJlcXVlc3QgZm9yIG1haWxib3gyICovDQojZGVmaW5lIENBTl9UU1JfVE1FMCAgICAgKCh1MzIpMHgwNDAwMDAwMCkgICAgLyogVHJhbnNtaXQgbWFpbGJveCAwIGVtcHR5ICovDQojZGVmaW5lIENBTl9UU1JfVE1FMSAgICAgKCh1MzIpMHgwODAwMDAwMCkgICAgLyogVHJhbnNtaXQgbWFpbGJveCAxIGVtcHR5ICovDQojZGVmaW5lIENBTl9UU1JfVE1FMiAgICAgKCh1MzIpMHgxMDAwMDAwMCkgICAgLyogVHJhbnNtaXQgbWFpbGJveCAyIGVtcHR5ICovDQoNCi8qIENBTiBSZWNlaXZlIEZJRk8gMCBSZWdpc3RlciBiaXRzICovDQojZGVmaW5lIENBTl9SRjBSX0ZVTEwwICAgKCh1MzIpMHgwMDAwMDAwOCkgICAgLyogRklGTyAwIGZ1bGwgKi8NCiNkZWZpbmUgQ0FOX1JGMFJfRk9WUjAgICAoKHUzMikweDAwMDAwMDEwKSAgICAvKiBGSUZPIDAgb3ZlcnJ1biAqLw0KI2RlZmluZSBDQU5fUkYwUl9SRk9NMCAgICgodTMyKTB4MDAwMDAwMjApICAgIC8qIFJlbGVhc2UgRklGTyAwIG91dHB1dCBtYWlsYm94ICovDQoNCi8qIENBTiBSZWNlaXZlIEZJRk8gMSBSZWdpc3RlciBiaXRzICovDQojZGVmaW5lIENBTl9SRjFSX0ZVTEwxICAgKCh1MzIpMHgwMDAwMDAwOCkgICAgLyogRklGTyAxIGZ1bGwgKi8NCiNkZWZpbmUgQ0FOX1JGMVJfRk9WUjEgICAoKHUzMikweDAwMDAwMDEwKSAgICAvKiBGSUZPIDEgb3ZlcnJ1biAqLw0KI2RlZmluZSBDQU5fUkYxUl9SRk9NMSAgICgodTMyKTB4MDAwMDAwMjApICAgIC8qIFJlbGVhc2UgRklGTyAxIG91dHB1dCBtYWlsYm94ICovDQoNCi8qIENBTiBFcnJvciBTdGF0dXMgUmVnaXN0ZXIgYml0cyAqLw0KI2RlZmluZSBDQU5fRVNSX0VXR0YgICAgICgodTMyKTB4MDAwMDAwMDEpICAgIC8qIEVycm9yIHdhcm5pbmcgZmxhZyAqLw0KI2RlZmluZSBDQU5fRVNSX0VQVkYgICAgICgodTMyKTB4MDAwMDAwMDIpICAgIC8qIEVycm9yIHBhc3NpdmUgZmxhZyAqLw0KI2RlZmluZSBDQU5fRVNSX0JPRkYgICAgICgodTMyKTB4MDAwMDAwMDQpICAgIC8qIEJ1cy1vZmYgZmxhZyAqLw0KDQovKiBDQU4gTWFpbGJveCBUcmFuc21pdCBSZXF1ZXN0ICovDQojZGVmaW5lIENBTl9UTUlEeFJfVFhSUSAgICAoKHUzMikweDAwMDAwMDAxKSAvKiBUcmFuc21pdCBtYWlsYm94IHJlcXVlc3QgKi8NCg0KLyogQ0FOIEZpbHRlciBNYXN0ZXIgUmVnaXN0ZXIgYml0cyAqLw0KI2RlZmluZSBDQU5fRk1SX0ZJTklUICgodTMyKTB4MDAwMDAwMDEpIC8qIEZpbHRlciBpbml0IG1vZGUgKi8NCg0KDQovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpzdGF0aWMgSVRTdGF0dXMgQ2hlY2tJVFN0YXR1cyh1MzIgQ0FOX1JlZywgdTMyIEl0X0JpdCk7DQoNCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IENBTl9EZUluaXQNCiogRGVzY3JpcHRpb24gICAgOiBEZWluaXRpYWxpemVzIHRoZSBDQU4gcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdA0KKiAgICAgICAgICAgICAgICAgIHJlc2V0IHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiBOb25lLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUuDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIENBTl9EZUluaXQodm9pZCkNCnsNCiAgLyogRW5hYmxlIENBTiByZXNldCBzdGF0ZSAqLw0KICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0NBTiwgRU5BQkxFKTsNCiAgLyogUmVsZWFzZSBDQU4gZnJvbSByZXNldCBzdGF0ZSAqLw0KICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0NBTiwgRElTQUJMRSk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX0luaXQNCiogRGVzY3JpcHRpb24gICAgOiBJbml0aWFsaXplcyB0aGUgQ0FOIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDQU5fSW5pdFN0cnVjdC4NCiogSW5wdXQgICAgICAgICAgOiBDQU5fSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIENBTl9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgQ0FOIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBDb25zdGFudCBpbmRpY2F0ZXMgaW5pdGlhbGl6YXRpb24gc3VjY2VlZCB3aGljaCB3aWxsIGJlIA0KKiAgICAgICAgICAgICAgICAgIENBTklOSVRGQUlMRUQgb3IgQ0FOSU5JVE9LLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnU4IENBTl9Jbml0KENBTl9Jbml0VHlwZURlZiogQ0FOX0luaXRTdHJ1Y3QpDQp7DQogIHU4IEluaXRTdGF0dXMgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKENBTl9Jbml0U3RydWN0LT5DQU5fVFRDTSkpOw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShDQU5fSW5pdFN0cnVjdC0+Q0FOX0FCT00pKTsNCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9BV1VNKSk7DQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKENBTl9Jbml0U3RydWN0LT5DQU5fTkFSVCkpOw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShDQU5fSW5pdFN0cnVjdC0+Q0FOX1JGTE0pKTsNCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9UWEZQKSk7DQogIGFzc2VydChJU19DQU5fTU9ERShDQU5fSW5pdFN0cnVjdC0+Q0FOX01vZGUpKTsNCiAgYXNzZXJ0KElTX0NBTl9TSlcoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9TSlcpKTsNCiAgYXNzZXJ0KElTX0NBTl9CUzEoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9CUzEpKTsNCiAgYXNzZXJ0KElTX0NBTl9CUzIoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9CUzIpKTsNCiAgYXNzZXJ0KElTX0NBTl9DTE9DSyhDQU5fSW5pdFN0cnVjdC0+Q0FOX0Nsb2NrKSk7DQogIGFzc2VydChJU19DQU5fUFJFU0NBTEVSKENBTl9Jbml0U3RydWN0LT5DQU5fUHJlc2NhbGVyKSk7DQoNCiAgLyogUmVxdWVzdCBpbml0aWFsaXNhdGlvbiAqLw0KICBDQU4tPk1DUiA9IENBTl9NQ1JfSU5SUTsNCg0KICAvKiAuLi5hbmQgY2hlY2sgYWNrbm93bGVkZ2VkICovDQogIGlmICgoQ0FOLT5NU1IgJiBDQU5fTVNSX0lOQUspID09IDApDQogIHsNCiAgICBJbml0U3RhdHVzID0gQ0FOSU5JVEZBSUxFRDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBTZXQgdGhlIHRpbWUgdHJpZ2dlcmVkIGNvbW11bmljYXRpb24gbW9kZSAqLw0KICAgIGlmIChDQU5fSW5pdFN0cnVjdC0+Q0FOX1RUQ00gPT0gRU5BQkxFKQ0KICAgIHsNCiAgICAgIENBTi0+TUNSIHw9IENBTl9NQ1JfVFRDTTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIENBTi0+TUNSICY9IH5DQU5fTUNSX1RUQ007DQogICAgfQ0KDQogICAgLyogU2V0IHRoZSBhdXRvbWF0aWMgYnVzLW9mZiBtYW5hZ2VtZW50ICovDQogICAgaWYgKENBTl9Jbml0U3RydWN0LT5DQU5fQUJPTSA9PSBFTkFCTEUpDQogICAgew0KICAgICAgQ0FOLT5NQ1IgfD0gQ0FOX01DUl9BQk9NOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgQ0FOLT5NQ1IgJj0gfkNBTl9NQ1JfQUJPTTsNCiAgICB9DQoNCiAgICAvKiBTZXQgdGhlIGF1dG9tYXRpYyB3YWtlLXVwIG1vZGUgKi8NCiAgICBpZiAoQ0FOX0luaXRTdHJ1Y3QtPkNBTl9BV1VNID09IEVOQUJMRSkNCiAgICB7DQogICAgICBDQU4tPk1DUiB8PSBDQU5fTUNSX0FXVU07DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBDQU4tPk1DUiAmPSB+Q0FOX01DUl9BV1VNOw0KICAgIH0NCg0KICAgIC8qIFNldCB0aGUgbm8gYXV0b21hdGljIHJldHJhbnNtaXNzaW9uICovDQogICAgaWYgKENBTl9Jbml0U3RydWN0LT5DQU5fTkFSVCA9PSBFTkFCTEUpDQogICAgew0KICAgICAgQ0FOLT5NQ1IgfD0gQ0FOX01DUl9OQVJUOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgQ0FOLT5NQ1IgJj0gfkNBTl9NQ1JfTkFSVDsNCiAgICB9DQoNCiAgICAvKiBTZXQgdGhlIHJlY2VpdmUgRklGTyBsb2NrZWQgbW9kZSAqLw0KICAgIGlmIChDQU5fSW5pdFN0cnVjdC0+Q0FOX1JGTE0gPT0gRU5BQkxFKQ0KICAgIHsNCiAgICAgIENBTi0+TUNSIHw9IENBTl9NQ1JfUkZMTTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIENBTi0+TUNSICY9IH5DQU5fTUNSX1JGTE07DQogICAgfQ0KDQogICAgLyogU2V0IHRoZSB0cmFuc21pdCBGSUZPIHByaW9yaXR5ICovDQogICAgaWYgKENBTl9Jbml0U3RydWN0LT5DQU5fVFhGUCA9PSBFTkFCTEUpDQogICAgew0KICAgICAgQ0FOLT5NQ1IgfD0gQ0FOX01DUl9UWEZQOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgQ0FOLT5NQ1IgJj0gfkNBTl9NQ1JfVFhGUDsNCiAgICB9DQoNCiAgICAvKiBTZXQgdGhlIGJpdCB0aW1pbmcgcmVnaXN0ZXIgKi8NCiAgICBDQU4tPkJUUiA9ICh1MzIpKCh1MzIpQ0FOX0luaXRTdHJ1Y3QtPkNBTl9Nb2RlIDw8IDMwKSB8ICgodTMyKUNBTl9Jbml0U3RydWN0LT5DQU5fU0pXIDw8IDI0KSB8DQogICAgICAgICAgICAgICAoKHUzMilDQU5fSW5pdFN0cnVjdC0+Q0FOX0JTMSA8PCAxNikgfCAoKHUzMilDQU5fSW5pdFN0cnVjdC0+Q0FOX0JTMiA8PCAyMCkgfA0KICAgICAgICAgICAgICAgKCh1MzIpQ0FOX0luaXRTdHJ1Y3QtPkNBTl9DbG9jayA8PCAxNSkgfCAoKHUzMilDQU5fSW5pdFN0cnVjdC0+Q0FOX1ByZXNjYWxlciAtIDEpOw0KDQogICAgSW5pdFN0YXR1cyA9IENBTklOSVRPSzsNCg0KICAgIC8qIFJlcXVlc3QgbGVhdmUgaW5pdGlhbGlzYXRpb24gKi8NCiAgICBDQU4tPk1DUiAmPSB+Q0FOX01DUl9JTlJROw0KDQogICAgLyogLi4uYW5kIGNoZWNrIGFja25vd2xlZGdlZCAqLw0KICAgIGlmICgoQ0FOLT5NU1IgJiBDQU5fTVNSX0lOQUspICE9IENBTl9NU1JfSU5BSykNCiAgICB7DQogICAgICBJbml0U3RhdHVzID0gQ0FOSU5JVEZBSUxFRDsNCiAgICB9DQogIH0NCg0KICAvKiBBdCB0aGlzIHN0ZXAsIHJldHVybiB0aGUgc3RhdHVzIG9mIGluaXRpYWxpemF0aW9uICovDQogIHJldHVybiBJbml0U3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IENBTl9GaWx0ZXJJbml0DQoqIERlc2NyaXB0aW9uICAgIDogSW5pdGlhbGl6ZXMgdGhlIENBTiBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgQ0FOX0ZpbHRlckluaXRTdHJ1Y3QuDQoqIElucHV0ICAgICAgICAgIDogQ0FOX0ZpbHRlckluaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBDQU5fRmlsdGVySW5pdFR5cGVEZWYNCiogICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lLg0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBDQU5fRmlsdGVySW5pdChDQU5fRmlsdGVySW5pdFR5cGVEZWYqIENBTl9GaWx0ZXJJbml0U3RydWN0KQ0Kew0KICB1MTYgRmlsdGVyTnVtYmVyX0JpdFBvcyA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0NBTl9GSUxURVJfTlVNQkVSKENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTnVtYmVyKSk7DQogIGFzc2VydChJU19DQU5fRklMVEVSX01PREUoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJNb2RlKSk7DQogIGFzc2VydChJU19DQU5fRklMVEVSX1NDQUxFKENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyU2NhbGUpKTsNCiAgYXNzZXJ0KElTX0NBTl9GSUxURVJfRklGTyhDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlckZJRk9Bc3NpZ25tZW50KSk7DQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyQWN0aXZhdGlvbikpOw0KDQogIEZpbHRlck51bWJlcl9CaXRQb3MgPSAodTE2KSgodTE2KTB4MDAwMSA8PCAoKHUxNilDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck51bWJlcikpOw0KDQogIC8qIEluaXRpYWxpc2F0aW9uIG1vZGUgZm9yIHRoZSBmaWx0ZXIgKi8NCiAgQ0FOLT5GTVIgfD0gQ0FOX0ZNUl9GSU5JVDsNCg0KICAvKiBGaWx0ZXIgRGVhY3RpdmF0aW9uICovDQogIENBTi0+RkEwUiAmPSB+KHUzMilGaWx0ZXJOdW1iZXJfQml0UG9zOw0KDQogIC8qIEZpbHRlciBTY2FsZSAqLw0KICBpZiAoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJTY2FsZSA9PSBDQU5fRmlsdGVyU2NhbGVfMTZiaXQpDQogIHsNCiAgICAvKiAxNi1iaXQgc2NhbGUgZm9yIHRoZSBmaWx0ZXIgKi8NCiAgICBDQU4tPkZTMFIgJj0gfih1MzIpRmlsdGVyTnVtYmVyX0JpdFBvczsNCg0KICAgIC8qIEZpcnN0IDE2LWJpdCBpZGVudGlmaWVyIGFuZCBGaXJzdCAxNi1iaXQgbWFzayAqLw0KICAgIC8qIE9yIEZpcnN0IDE2LWJpdCBpZGVudGlmaWVyIGFuZCBTZWNvbmQgMTYtYml0IGlkZW50aWZpZXIgKi8NCiAgICBDQU4tPnNGaWx0ZXJSZWdpc3RlcltDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck51bWJlcl0uRlIwID0gKCh1MzIpKCh1MzIpMHgwMDAwRkZGRiAmIENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTWFza0lkTG93KSA8PCAxNikgfA0KICAgICAgICAoKHUzMikweDAwMDBGRkZGICYgQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJJZExvdyk7DQoNCiAgICAvKiBTZWNvbmQgMTYtYml0IGlkZW50aWZpZXIgYW5kIFNlY29uZCAxNi1iaXQgbWFzayAqLw0KICAgIC8qIE9yIFRoaXJkIDE2LWJpdCBpZGVudGlmaWVyIGFuZCBGb3VydGggMTYtYml0IGlkZW50aWZpZXIgKi8NCiAgICBDQU4tPnNGaWx0ZXJSZWdpc3RlcltDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck51bWJlcl0uRlIxID0gKCh1MzIpKCh1MzIpMHgwMDAwRkZGRiAmIENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyTWFza0lkSGlnaCkgPDwgMTYpIHwNCiAgICAgICAgKCh1MzIpMHgwMDAwRkZGRiAmIENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVySWRIaWdoKTsNCiAgfQ0KICBpZiAoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJTY2FsZSA9PSBDQU5fRmlsdGVyU2NhbGVfMzJiaXQpDQogIHsNCiAgICAvKiAzMi1iaXQgc2NhbGUgZm9yIHRoZSBmaWx0ZXIgKi8NCiAgICBDQU4tPkZTMFIgfD0gRmlsdGVyTnVtYmVyX0JpdFBvczsNCg0KICAgIC8qIDMyLWJpdCBpZGVudGlmaWVyIG9yIEZpcnN0IDMyLWJpdCBpZGVudGlmaWVyICovDQogICAgQ0FOLT5zRmlsdGVyUmVnaXN0ZXJbQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJOdW1iZXJdLkZSMCA9ICgodTMyKSgodTMyKTB4MDAwMEZGRkYgJiBDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlcklkSGlnaCkgPDwgMTYpIHwNCiAgICAgICAgKCh1MzIpMHgwMDAwRkZGRiAmIENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVySWRMb3cpOw0KDQogICAgLyogMzItYml0IG1hc2sgb3IgU2Vjb25kIDMyLWJpdCBpZGVudGlmaWVyICovDQogICAgQ0FOLT5zRmlsdGVyUmVnaXN0ZXJbQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJOdW1iZXJdLkZSMSA9ICgodTMyKSgodTMyKTB4MDAwMEZGRkYgJiBDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck1hc2tJZEhpZ2gpIDw8IDE2KSB8DQogICAgICAgICgodTMyKTB4MDAwMEZGRkYgJiBDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck1hc2tJZExvdyk7DQoNCiAgfQ0KDQogIC8qIEZpbHRlciBNb2RlICovDQogIGlmIChDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlck1vZGUgPT0gQ0FOX0ZpbHRlck1vZGVfSWRNYXNrKQ0KICB7DQogICAgLypJZC9NYXNrIG1vZGUgZm9yIHRoZSBmaWx0ZXIqLw0KICAgIENBTi0+Rk0wUiAmPSB+KHUzMilGaWx0ZXJOdW1iZXJfQml0UG9zOw0KICB9DQogIGVsc2UgLyogQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJNb2RlID09IENBTl9GaWx0ZXJNb2RlX0lkTGlzdCAqLw0KICB7DQogICAgLypJZGVudGlmaWVyIGxpc3QgbW9kZSBmb3IgdGhlIGZpbHRlciovDQogICAgQ0FOLT5GTTBSIHw9ICh1MzIpRmlsdGVyTnVtYmVyX0JpdFBvczsNCiAgfQ0KDQogIC8qIEZpbHRlciBGSUZPIGFzc2lnbm1lbnQgKi8NCiAgaWYgKENBTl9GaWx0ZXJJbml0U3RydWN0LT5DQU5fRmlsdGVyRklGT0Fzc2lnbm1lbnQgPT0gQ0FOX0ZpbHRlckZJRk8wKQ0KICB7DQogICAgLyogRklGTyAwIGFzc2lnbmF0aW9uIGZvciB0aGUgZmlsdGVyICovDQogICAgQ0FOLT5GRkEwUiAmPSB+KHUzMilGaWx0ZXJOdW1iZXJfQml0UG9zOw0KICB9DQogIGlmIChDQU5fRmlsdGVySW5pdFN0cnVjdC0+Q0FOX0ZpbHRlckZJRk9Bc3NpZ25tZW50ID09IENBTl9GaWx0ZXJGSUZPMSkNCiAgew0KICAgIC8qIEZJRk8gMSBhc3NpZ25hdGlvbiBmb3IgdGhlIGZpbHRlciAqLw0KICAgIENBTi0+RkZBMFIgfD0gKHUzMilGaWx0ZXJOdW1iZXJfQml0UG9zOw0KICB9DQogIA0KICAvKiBGaWx0ZXIgYWN0aXZhdGlvbiAqLw0KICBpZiAoQ0FOX0ZpbHRlckluaXRTdHJ1Y3QtPkNBTl9GaWx0ZXJBY3RpdmF0aW9uID09IEVOQUJMRSkNCiAgew0KICAgIENBTi0+RkEwUiB8PSBGaWx0ZXJOdW1iZXJfQml0UG9zOw0KICB9DQoNCiAgLyogTGVhdmUgdGhlIGluaXRpYWxpc2F0aW9uIG1vZGUgZm9yIHRoZSBmaWx0ZXIgKi8NCiAgQ0FOLT5GTVIgJj0gfkNBTl9GTVJfRklOSVQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX1N0cnVjdEluaXQNCiogRGVzY3JpcHRpb24gICAgOiBGaWxscyBlYWNoIENBTl9Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IENBTl9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgQ0FOX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaA0KKiAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQ0FOX1N0cnVjdEluaXQoQ0FOX0luaXRUeXBlRGVmKiBDQU5fSW5pdFN0cnVjdCkNCnsNCiAgLyogUmVzZXQgQ0FOIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzICovDQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgdGltZSB0cmlnZ2VyZWQgY29tbXVuaWNhdGlvbiBtb2RlICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fVFRDTSA9IERJU0FCTEU7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgYXV0b21hdGljIGJ1cy1vZmYgbWFuYWdlbWVudCAqLw0KICBDQU5fSW5pdFN0cnVjdC0+Q0FOX0FCT00gPSBESVNBQkxFOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIGF1dG9tYXRpYyB3YWtlLXVwIG1vZGUgKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9BV1VNID0gRElTQUJMRTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBubyBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9OQVJUID0gRElTQUJMRTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSByZWNlaXZlIEZJRk8gbG9ja2VkIG1vZGUgKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9SRkxNID0gRElTQUJMRTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSB0cmFuc21pdCBGSUZPIHByaW9yaXR5ICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fVFhGUCA9IERJU0FCTEU7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgQ0FOX01vZGUgbWVtYmVyICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fTW9kZSA9IENBTl9Nb2RlX05vcm1hbDsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBDQU5fU0pXIG1lbWJlciAqLw0KICBDQU5fSW5pdFN0cnVjdC0+Q0FOX1NKVyA9IENBTl9TSldfMHRxOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIENBTl9CUzEgbWVtYmVyICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fQlMxID0gQ0FOX0JTMV80dHE7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgQ0FOX0JTMiBtZW1iZXIgKi8NCiAgQ0FOX0luaXRTdHJ1Y3QtPkNBTl9CUzIgPSBDQU5fQlMyXzN0cTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBDQU5fQ2xvY2sgbWVtYmVyICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fQ2xvY2sgPSBDQU5fQ2xvY2tfQVBCOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIENBTl9QcmVzY2FsZXIgbWVtYmVyICovDQogIENBTl9Jbml0U3RydWN0LT5DQU5fUHJlc2NhbGVyID0gMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBDQU5fSVRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBDQU4gaW50ZXJydXB0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIENBTl9JVDogc3BlY2lmaWVzIHRoZSBDQU4gaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvcg0KKiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBDQU4gaW50ZXJydXB0cy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQ0FOX0lUQ29uZmlnKHUzMiBDQU5fSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0NBTl9JVChDQU5fSVQpKTsNCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQ0FOIGludGVycnVwdCAqLw0KICAgIENBTi0+SUVSIHw9IENBTl9JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBDQU4gaW50ZXJydXB0ICovDQogICAgQ0FOLT5JRVIgJj0gfkNBTl9JVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IENBTl9UcmFuc21pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYXRlcyB0aGUgdHJhbnNtaXNzaW9uIG9mIGEgbWVzc2FnZS4NCiogSW5wdXQgICAgICAgICAgOiBUeE1lc3NhZ2U6IHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgQ0FOIElkLCBDQU4NCiogICAgICAgICAgICAgICAgICBETEMgYW5kIENBTiBkYXRhcy4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lLg0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBudW1iZXIgb2YgdGhlIG1haWxib3ggdGhhdCBpcyB1c2VkIGZvciB0cmFuc21pc3Npb24NCiogICAgICAgICAgICAgICAgICBvciBDQU5fTk9fTUIgaWYgdGhlcmUgaXMgbm8gZW1wdHkgbWFpbGJveC4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1OCBDQU5fVHJhbnNtaXQoQ2FuVHhNc2cqIFR4TWVzc2FnZSkNCnsNCiAgdTggVHJhbnNtaXRNYWlsYm94ID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfQ0FOX1NURElEKFR4TWVzc2FnZS0+U3RkSWQpKTsNCiAgYXNzZXJ0KElTX0NBTl9FWFRJRChUeE1lc3NhZ2UtPlN0ZElkKSk7DQogIGFzc2VydChJU19DQU5fSURUWVBFKFR4TWVzc2FnZS0+SURFKSk7DQogIGFzc2VydChJU19DQU5fUlRSKFR4TWVzc2FnZS0+UlRSKSk7DQogIGFzc2VydChJU19DQU5fRExDKFR4TWVzc2FnZS0+RExDKSk7DQoNCiAgLyogU2VsZWN0IG9uZSBlbXB0eSB0cmFuc21pdCBtYWlsYm94ICovDQogIGlmICgoQ0FOLT5UU1ImQ0FOX1RTUl9UTUUwKSA9PSBDQU5fVFNSX1RNRTApDQogIHsNCiAgICBUcmFuc21pdE1haWxib3ggPSAwOw0KICB9DQogIGVsc2UgaWYgKChDQU4tPlRTUiZDQU5fVFNSX1RNRTEpID09IENBTl9UU1JfVE1FMSkNCiAgew0KICAgIFRyYW5zbWl0TWFpbGJveCA9IDE7DQogIH0NCiAgZWxzZSBpZiAoKENBTi0+VFNSJkNBTl9UU1JfVE1FMikgPT0gQ0FOX1RTUl9UTUUyKQ0KICB7DQogICAgVHJhbnNtaXRNYWlsYm94ID0gMjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBUcmFuc21pdE1haWxib3ggPSBDQU5fTk9fTUI7DQogIH0NCg0KICBpZiAoVHJhbnNtaXRNYWlsYm94ICE9IENBTl9OT19NQikNCiAgew0KICAgIC8qIFNldCB1cCB0aGUgSWQgKi8NCiAgICBUeE1lc3NhZ2UtPlN0ZElkICY9ICh1MzIpMHgwMDAwMDdGRjsNCiAgICBUeE1lc3NhZ2UtPlN0ZElkID0gVHhNZXNzYWdlLT5TdGRJZCA8PCAyMTsNCiAgICBUeE1lc3NhZ2UtPkV4dElkICY9ICh1MzIpMHgwMDAzRkZGRjsNCiAgICBUeE1lc3NhZ2UtPkV4dElkIDw8PSAzOw0KDQogICAgQ0FOLT5zVHhNYWlsQm94W1RyYW5zbWl0TWFpbGJveF0uVElSICY9IENBTl9UTUlEeFJfVFhSUTsNCiAgICBDQU4tPnNUeE1haWxCb3hbVHJhbnNtaXRNYWlsYm94XS5USVIgfD0gKFR4TWVzc2FnZS0+U3RkSWQgfCBUeE1lc3NhZ2UtPkV4dElkIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhNZXNzYWdlLT5JREUgfCBUeE1lc3NhZ2UtPlJUUik7DQoNCiAgICAvKiBTZXQgdXAgdGhlIERMQyAqLw0KICAgIFR4TWVzc2FnZS0+RExDICY9ICh1OCkweDAwMDAwMDBGOw0KICAgIENBTi0+c1R4TWFpbEJveFtUcmFuc21pdE1haWxib3hdLlREVFIgJj0gKHUzMikweEZGRkZGRkYwOw0KICAgIENBTi0+c1R4TWFpbEJveFtUcmFuc21pdE1haWxib3hdLlREVFIgfD0gVHhNZXNzYWdlLT5ETEM7DQoNCiAgICAvKiBTZXQgdXAgdGhlIGRhdGEgZmllbGQgKi8NCiAgICBDQU4tPnNUeE1haWxCb3hbVHJhbnNtaXRNYWlsYm94XS5URExSID0gKCgodTMyKVR4TWVzc2FnZS0+RGF0YVszXSA8PCAyNCkgfCAoKHUzMilUeE1lc3NhZ2UtPkRhdGFbMl0gPDwgMTYpIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpVHhNZXNzYWdlLT5EYXRhWzFdIDw8IDgpIHwgKCh1MzIpVHhNZXNzYWdlLT5EYXRhWzBdKSk7DQogICAgQ0FOLT5zVHhNYWlsQm94W1RyYW5zbWl0TWFpbGJveF0uVERIUiA9ICgoKHUzMilUeE1lc3NhZ2UtPkRhdGFbN10gPDwgMjQpIHwgKCh1MzIpVHhNZXNzYWdlLT5EYXRhWzZdIDw8IDE2KSB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKVR4TWVzc2FnZS0+RGF0YVs1XSA8PCA4KSB8ICgodTMyKVR4TWVzc2FnZS0+RGF0YVs0XSkpOw0KDQogICAgLyogUmVxdWVzdCB0cmFuc21pc3Npb24gKi8NCiAgICBDQU4tPnNUeE1haWxCb3hbVHJhbnNtaXRNYWlsYm94XS5USVIgfD0gQ0FOX1RNSUR4Ul9UWFJROw0KICB9DQoNCiAgcmV0dXJuIFRyYW5zbWl0TWFpbGJveDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBDQU5fVHJhbnNtaXRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVjayB0aGUgdHJhbnNtaXNzaW9uIG9mIGEgbWVzc2FnZS4NCiogSW5wdXQgICAgICAgICAgOiBUcmFuc21pdE1haWxib3g6IHRoZSBudW1iZXIgb2YgdGhlIG1haWxib3ggdGhhdCBpcyB1c2VkIGZvcg0KKiAgICAgICAgICAgICAgICAgIHRyYW5zbWlzc2lvbi4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lLg0KKiBSZXR1cm4gICAgICAgICA6IENBTlRYT0sgaWYgdGhlIENBTiBkcml2ZXIgdHJhbnNtaXRzIHRoZSBtZXNzYWdlLCBDQU5UWEZBSUxFRA0KKiAgICAgICAgICAgICAgICAgIGluIGFuIG90aGVyIGNhc2UuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTMyIENBTl9UcmFuc21pdFN0YXR1cyh1OCBUcmFuc21pdE1haWxib3gpDQp7DQogIC8qIFJRQ1AsIFRYT0sgYW5kIFRNRSBiaXRzICovDQogIHUzMiBTdGF0ZSA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0NBTl9UUkFOU01JVE1BSUxCT1goVHJhbnNtaXRNYWlsYm94KSk7DQoNCiAgc3dpdGNoIChUcmFuc21pdE1haWxib3gpDQogIHsNCiAgICBjYXNlICgwKTogU3RhdGUgfD0gKChDQU4tPlRTUiAmIENBTl9UU1JfUlFDUDApIDw8IDIpOw0KICAgICAgU3RhdGUgfD0gKChDQU4tPlRTUiAmIENBTl9UU1JfVFhPSzApID4+IDApOw0KICAgICAgU3RhdGUgfD0gKChDQU4tPlRTUiAmIENBTl9UU1JfVE1FMCkgPj4gMjYpOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSAoMSk6IFN0YXRlIHw9ICgoQ0FOLT5UU1IgJiBDQU5fVFNSX1JRQ1AxKSA+PiA2KTsNCiAgICAgIFN0YXRlIHw9ICgoQ0FOLT5UU1IgJiBDQU5fVFNSX1RYT0sxKSA+PiA4KTsNCiAgICAgIFN0YXRlIHw9ICgoQ0FOLT5UU1IgJiBDQU5fVFNSX1RNRTEpID4+IDI3KTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgKDIpOiBTdGF0ZSB8PSAoKENBTi0+VFNSICYgQ0FOX1RTUl9SUUNQMikgPj4gMTQpOw0KICAgICAgU3RhdGUgfD0gKChDQU4tPlRTUiAmIENBTl9UU1JfVFhPSzIpID4+IDE2KTsNCiAgICAgIFN0YXRlIHw9ICgoQ0FOLT5UU1IgJiBDQU5fVFNSX1RNRTIpID4+IDI4KTsNCiAgICAgIGJyZWFrOw0KICAgIGRlZmF1bHQ6DQogICAgICBTdGF0ZSA9IENBTlRYRkFJTEVEOw0KICAgICAgYnJlYWs7DQogIH0NCg0KICBzd2l0Y2ggKFN0YXRlKQ0KICB7DQogICAgICAvKiB0cmFuc21pdCBwZW5kaW5nICAqLw0KICAgIGNhc2UgKDB4MCk6IFN0YXRlID0gQ0FOVFhQRU5ESU5HOw0KICAgICAgYnJlYWs7DQogICAgICAvKiB0cmFuc21pdCBmYWlsZWQgICovDQogICAgY2FzZSAoMHg1KTogU3RhdGUgPSBDQU5UWEZBSUxFRDsNCiAgICAgIGJyZWFrOw0KICAgICAgLyogdHJhbnNtaXQgc3VjY2VkZWVkICAqLw0KICAgIGNhc2UgKDB4Nyk6IFN0YXRlID0gQ0FOVFhPSzsNCiAgICAgIGJyZWFrOw0KICAgIGRlZmF1bHQ6DQogICAgICBTdGF0ZSA9IENBTlRYRkFJTEVEOw0KICAgICAgYnJlYWs7DQogIH0NCg0KICByZXR1cm4gU3RhdGU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX0NhbmNlbFRyYW5zbWl0DQoqIERlc2NyaXB0aW9uICAgIDogQ2FuY2VscyBhIHRyYW5zbWl0IHJlcXVlc3QuDQoqIElucHV0ICAgICAgICAgIDogTWFpbGJveCBudW1iZXIuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQ0FOX0NhbmNlbFRyYW5zbWl0KHU4IE1haWxib3gpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19DQU5fVFJBTlNNSVRNQUlMQk9YKE1haWxib3gpKTsNCg0KICAvKiBhYm9ydCB0cmFuc21pc3Npb24gKi8NCiAgc3dpdGNoIChNYWlsYm94KQ0KICB7DQogICAgY2FzZSAoMCk6IENBTi0+VFNSIHw9IENBTl9UU1JfQUJSUTA7DQogICAgICBicmVhazsNCiAgICBjYXNlICgxKTogQ0FOLT5UU1IgfD0gQ0FOX1RTUl9BQlJRMTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgKDIpOiBDQU4tPlRTUiB8PSBDQU5fVFNSX0FCUlEyOw0KICAgICAgYnJlYWs7DQogICAgZGVmYXVsdDoNCiAgICAgIGJyZWFrOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX0ZJRk9SZWxlYXNlDQoqIERlc2NyaXB0aW9uICAgIDogUmVsZWFzZSBhIEZJRk8uDQoqIElucHV0ICAgICAgICAgIDogRklGT051bWJlcjogRklGTyB0byByZWxlYXNlLCBDQU5fRklGTzAgb3IgQ0FOX0ZJRk8xLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUuDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIENBTl9GSUZPUmVsZWFzZSh1OCBGSUZPTnVtYmVyKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfQ0FOX0ZJRk8oRklGT051bWJlcikpOw0KDQogIC8qIFJlbGVhc2UgRklGTzAgKi8NCiAgaWYgKEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8wKQ0KICB7DQogICAgQ0FOLT5SRjBSID0gQ0FOX1JGMFJfUkZPTTA7DQogIH0NCiAgLyogUmVsZWFzZSBGSUZPMSAqLw0KICBlbHNlIC8qIEZJRk9OdW1iZXIgPT0gQ0FOX0ZJRk8xICovDQogIHsNCiAgICBDQU4tPlJGMVIgPSBDQU5fUkYxUl9SRk9NMTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IENBTl9NZXNzYWdlUGVuZGluZw0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybiB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgbWVzc2FnZXMuDQoqIElucHV0ICAgICAgICAgIDogRklGT051bWJlcjogUmVjZWl2ZSBGSUZPIG51bWJlciwgQ0FOX0ZJRk8wIG9yIENBTl9GSUZPMS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lLg0KKiBSZXR1cm4gICAgICAgICA6IE5iTWVzc2FnZSB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgbWVzc2FnZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1OCBDQU5fTWVzc2FnZVBlbmRpbmcodTggRklGT051bWJlcikNCnsNCiAgdTggTWVzc2FnZVBlbmRpbmc9MDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfQ0FOX0ZJRk8oRklGT051bWJlcikpOw0KDQogIGlmIChGSUZPTnVtYmVyID09IENBTl9GSUZPMCkNCiAgew0KICAgIE1lc3NhZ2VQZW5kaW5nID0gKHU4KShDQU4tPlJGMFImKHUzMikweDAzKTsNCiAgfQ0KICBlbHNlIGlmIChGSUZPTnVtYmVyID09IENBTl9GSUZPMSkNCiAgew0KICAgIE1lc3NhZ2VQZW5kaW5nID0gKHU4KShDQU4tPlJGMVImKHUzMikweDAzKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBNZXNzYWdlUGVuZGluZyA9IDA7DQogIH0NCiAgcmV0dXJuIE1lc3NhZ2VQZW5kaW5nOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IENBTl9SZWNlaXZlDQoqIERlc2NyaXB0aW9uICAgIDogUmVjZWl2ZXMgYSBtZXNzYWdlLg0KKiBJbnB1dCAgICAgICAgICA6IEZJRk9OdW1iZXI6IFJlY2VpdmUgRklGTyBudW1iZXIsIENBTl9GSUZPMCBvciBDQU5fRklGTzEuDQoqIE91dHB1dCAgICAgICAgIDogUnhNZXNzYWdlOiBwb2ludGVyIHRvIGEgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIENBTiBJZCwNCiogICAgICAgICAgICAgICAgICBDQU4gRExDLCBDQU4gZGF0YXMgYW5kIEZNSSBudW1iZXIuDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIENBTl9SZWNlaXZlKHU4IEZJRk9OdW1iZXIsIENhblJ4TXNnKiBSeE1lc3NhZ2UpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19DQU5fRklGTyhGSUZPTnVtYmVyKSk7DQoNCiAgLyogR2V0IHRoZSBJZCAqLw0KICBSeE1lc3NhZ2UtPlN0ZElkID0gKHUzMikweDAwMDAwN0ZGICYgKENBTi0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJJUiA+PiAyMSk7DQogIFJ4TWVzc2FnZS0+RXh0SWQgPSAodTMyKTB4MDAwM0ZGRkYgJiAoQ0FOLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUklSID4+IDMpOw0KDQogIFJ4TWVzc2FnZS0+SURFID0gKHUzMikweDAwMDAwMDA0ICYgQ0FOLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUklSOw0KICBSeE1lc3NhZ2UtPlJUUiA9ICh1MzIpMHgwMDAwMDAwMiAmIENBTi0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJJUjsNCg0KICAvKiBHZXQgdGhlIERMQyAqLw0KICBSeE1lc3NhZ2UtPkRMQyA9ICh1MzIpMHgwMDAwMDAwRiAmIENBTi0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJEVFI7DQoNCiAgLyogR2V0IHRoZSBGTUkgKi8NCiAgUnhNZXNzYWdlLT5GTUkgPSAodTMyKTB4MDAwMDAwRkYgJiAoQ0FOLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRUUiA+PiA4KTsNCg0KICAvKiBHZXQgdGhlIGRhdGEgZmllbGQgKi8NCiAgUnhNZXNzYWdlLT5EYXRhWzBdID0gKHUzMikweDAwMDAwMEZGICYgQ0FOLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRMUjsNCiAgUnhNZXNzYWdlLT5EYXRhWzFdID0gKHUzMikweDAwMDAwMEZGICYgKENBTi0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJETFIgPj4gOCk7DQogIFJ4TWVzc2FnZS0+RGF0YVsyXSA9ICh1MzIpMHgwMDAwMDBGRiAmIChDQU4tPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SRExSID4+IDE2KTsNCiAgUnhNZXNzYWdlLT5EYXRhWzNdID0gKHUzMikweDAwMDAwMEZGICYgKENBTi0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJETFIgPj4gMjQpOw0KDQogIFJ4TWVzc2FnZS0+RGF0YVs0XSA9ICh1MzIpMHgwMDAwMDBGRiAmIENBTi0+c0ZJRk9NYWlsQm94W0ZJRk9OdW1iZXJdLlJESFI7DQogIFJ4TWVzc2FnZS0+RGF0YVs1XSA9ICh1MzIpMHgwMDAwMDBGRiAmIChDQU4tPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSID4+IDgpOw0KICBSeE1lc3NhZ2UtPkRhdGFbNl0gPSAodTMyKTB4MDAwMDAwRkYgJiAoQ0FOLT5zRklGT01haWxCb3hbRklGT051bWJlcl0uUkRIUiA+PiAxNik7DQogIFJ4TWVzc2FnZS0+RGF0YVs3XSA9ICh1MzIpMHgwMDAwMDBGRiAmIChDQU4tPnNGSUZPTWFpbEJveFtGSUZPTnVtYmVyXS5SREhSID4+IDI0KTsNCg0KICAvKiBSZWxlYXNlIHRoZSBGSUZPICovDQogIENBTl9GSUZPUmVsZWFzZShGSUZPTnVtYmVyKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBDQU5fU2xlZXANCiogRGVzY3JpcHRpb24gICAgOiBFbnRlcnMgdGhlIGxvdyBwb3dlciBtb2RlLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBDQU5TTEVFUE9LIGlmIHNsZWVwIGVudGVyZWQsIENBTlNMRUVQRkFJTEVEIGluIGFuIG90aGVyIGNhc2UuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTggQ0FOX1NsZWVwKHZvaWQpDQp7DQogIHU4IFNsZWVwU3RhdHVzID0gMDsNCg0KICAvKiBTbGVlcCBtb2RlIGVudGVyaW5nIHJlcXVlc3QgKi8NCiAgQ0FOLT5NQ1IgfD0gQ0FOX01DUl9TTEVFUDsNCiAgU2xlZXBTdGF0dXMgPSBDQU5TTEVFUE9LOw0KDQogIC8qIFNsZWVwIG1vZGUgc3RhdHVzICovDQogIGlmICgoQ0FOLT5NQ1ImQ0FOX01DUl9TTEVFUCkgPT0gMCkNCiAgew0KICAgIC8qIFNsZWVwIG1vZGUgbm90IGVudGVyZWQgKi8NCiAgICBTbGVlcFN0YXR1cyA9IENBTlNMRUVQRkFJTEVEOw0KICB9DQoNCiAgLyogQXQgdGhpcyBzdGVwLCBzbGVlcCBtb2RlIHN0YXR1cyAqLw0KICByZXR1cm4gU2xlZXBTdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQ0FOX1dha2VVcA0KKiBEZXNjcmlwdGlvbiAgICA6IFdha2VzIHRoZSBDQU4gdXAuDQoqIElucHV0ICAgICAgICAgIDogTm9uZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lLg0KKiBSZXR1cm4gICAgICAgICA6IENBTldBS0VVUE9LIGlmIHNsZWVwIG1vZGUgbGVmdCwgQ0FOV0FLRVVQRkFJTEVEIGluIGFuIG90aGVyDQoqICAgICAgICAgICAgICAgICAgY2FzZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1OCBDQU5fV2FrZVVwKHZvaWQpDQp7DQogIHU4IFdha2VVcFN0YXR1cyA9IDA7DQoNCiAgLyogV2FrZSB1cCByZXF1ZXN0ICovDQogIENBTi0+TUNSICY9IH5DQU5fTUNSX1NMRUVQOw0KICBXYWtlVXBTdGF0dXMgPSBDQU5XQUtFVVBGQUlMRUQ7DQoNCiAgLyogU2xlZXAgbW9kZSBzdGF0dXMgKi8NCiAgaWYgKChDQU4tPk1DUiZDQU5fTUNSX1NMRUVQKSA9PSAwKQ0KICB7DQogICAgLyogU2xlZXAgbW9kZSBleGl0ZWQgKi8NCiAgICBXYWtlVXBTdGF0dXMgPSBDQU5XQUtFVVBPSzsNCiAgfQ0KDQogIC8qIEF0IHRoaXMgc3RlcCwgc2xlZXAgbW9kZSBzdGF0dXMgKi8NCiAgcmV0dXJuIFdha2VVcFN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBDQU5fR2V0RmxhZ1N0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBDQU4gZmxhZyBpcyBzZXQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IENBTl9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIENBTl9GTEFHIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgQ0FOX0dldEZsYWdTdGF0dXModTMyIENBTl9GTEFHKQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19DQU5fRkxBRyhDQU5fRkxBRykpOw0KDQogIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBDQU4gZmxhZyAqLw0KICBpZiAoKENBTi0+RVNSICYgQ0FOX0ZMQUcpICE9ICh1MzIpUkVTRVQpDQogIHsNCiAgICAvKiBDQU5fRkxBRyBpcyBzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogQ0FOX0ZMQUcgaXMgcmVzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICAvKiBSZXR1cm4gdGhlIENBTl9GTEFHIHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBDQU5fQ2xlYXJGbGFnDQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBDQU4ncyBwZW5kaW5nIGZsYWdzLg0KKiBJbnB1dCAgICAgICAgICA6IENBTl9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQ0FOX0NsZWFyRmxhZyh1MzIgQ0FOX0ZMQUcpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19DQU5fRkxBRyhDQU5fRkxBRykpOw0KDQogIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBDQU4gZmxhZ3MgKi8NCiAgQ0FOLT5FU1IgJj0gfkNBTl9GTEFHOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IENBTl9HZXRJVFN0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBDQU4gaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogQ0FOX0lUOiBzcGVjaWZpZXMgdGhlIENBTiBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUuDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBDQU5fSVQgKFNFVCBvciBSRVNFVCkuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KSVRTdGF0dXMgQ0FOX0dldElUU3RhdHVzKHUzMiBDQU5fSVQpDQp7DQogIElUU3RhdHVzIHBlbmRpbmdiaXRzdGF0dXMgPSBSRVNFVDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfQ0FOX0lUKENBTl9JVCkpOw0KDQogIHN3aXRjaCAoQ0FOX0lUKQ0KICB7DQogICAgY2FzZSBDQU5fSVRfUlFDUDA6DQogICAgICBwZW5kaW5nYml0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU4tPlRTUiwgQ0FOX1RTUl9SUUNQMCk7DQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9SUUNQMToNCiAgICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTi0+VFNSLCBDQU5fVFNSX1JRQ1AxKTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX1JRQ1AyOg0KICAgICAgcGVuZGluZ2JpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOLT5UU1IsIENBTl9UU1JfUlFDUDIpOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfRkYwOg0KICAgICAgcGVuZGluZ2JpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOLT5SRjBSLCBDQU5fUkYwUl9GVUxMMCk7DQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9GT1YwOg0KICAgICAgcGVuZGluZ2JpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOLT5SRjBSLCBDQU5fUkYwUl9GT1ZSMCk7DQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9GRjE6DQogICAgICBwZW5kaW5nYml0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU4tPlJGMVIsIENBTl9SRjFSX0ZVTEwxKTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX0ZPVjE6DQogICAgICBwZW5kaW5nYml0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU4tPlJGMVIsIENBTl9SRjFSX0ZPVlIxKTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX0VXRzoNCiAgICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTi0+RVNSLCBDQU5fRVNSX0VXR0YpOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfRVBWOg0KICAgICAgcGVuZGluZ2JpdHN0YXR1cyA9IENoZWNrSVRTdGF0dXMoQ0FOLT5FU1IsIENBTl9FU1JfRVBWRik7DQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9CT0Y6DQogICAgICBwZW5kaW5nYml0c3RhdHVzID0gQ2hlY2tJVFN0YXR1cyhDQU4tPkVTUiwgQ0FOX0VTUl9CT0ZGKTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX1NMSzoNCiAgICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTi0+TVNSLCBDQU5fTVNSX1NMQUtJKTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX1dLVToNCiAgICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBDaGVja0lUU3RhdHVzKENBTi0+TVNSLCBDQU5fTVNSX1dLVUkpOw0KICAgICAgYnJlYWs7DQoNCiAgICBkZWZhdWx0IDoNCiAgICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBSRVNFVDsNCiAgICAgIGJyZWFrOw0KICB9DQoNCiAgLyogUmV0dXJuIHRoZSBDQU5fSVQgc3RhdHVzICovDQogIHJldHVybiAgcGVuZGluZ2JpdHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBDQU5fQ2xlYXJJVFBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIENBTpJzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuDQoqIElucHV0ICAgICAgICAgIDogQ0FOX0lUOiBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lLg0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBDQU5fQ2xlYXJJVFBlbmRpbmdCaXQodTMyIENBTl9JVCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0NBTl9JVChDQU5fSVQpKTsNCg0KICBzd2l0Y2ggKENBTl9JVCkNCiAgew0KICAgIGNhc2UgQ0FOX0lUX1JRQ1AwOg0KICAgICAgQ0FOLT5UU1IgPSBDQU5fVFNSX1JRQ1AwOyAvKiByY193MSovDQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9SUUNQMToNCiAgICAgIENBTi0+VFNSID0gQ0FOX1RTUl9SUUNQMTsgLyogcmNfdzEqLw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfUlFDUDI6DQogICAgICBDQU4tPlRTUiA9IENBTl9UU1JfUlFDUDI7IC8qIHJjX3cxKi8NCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX0ZGMDoNCiAgICAgIENBTi0+UkYwUiA9IENBTl9SRjBSX0ZVTEwwOyAvKiByY193MSovDQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9GT1YwOg0KICAgICAgQ0FOLT5SRjBSID0gQ0FOX1JGMFJfRk9WUjA7IC8qIHJjX3cxKi8NCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX0ZGMToNCiAgICAgIENBTi0+UkYxUiA9IENBTl9SRjFSX0ZVTEwxOyAvKiByY193MSovDQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9GT1YxOg0KICAgICAgQ0FOLT5SRjFSID0gQ0FOX1JGMVJfRk9WUjE7IC8qIHJjX3cxKi8NCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX0VXRzoNCiAgICAgIENBTi0+RVNSICY9IH4gQ0FOX0VTUl9FV0dGOyAvKiBydyAqLw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfRVBWOg0KICAgICAgQ0FOLT5FU1IgJj0gfiBDQU5fRVNSX0VQVkY7IC8qIHJ3ICovDQogICAgICBicmVhazsNCiAgICBjYXNlIENBTl9JVF9CT0Y6DQogICAgICBDQU4tPkVTUiAmPSB+IENBTl9FU1JfQk9GRjsgLyogcncgKi8NCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgQ0FOX0lUX1dLVToNCiAgICAgIENBTi0+TVNSID0gQ0FOX01TUl9XS1VJOyAgLyogcmNfdzEqLw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBDQU5fSVRfU0xLOg0KICAgICAgQ0FOLT5NU1IgPSBDQU5fTVNSX1NMQUtJOyAgLyogcmNfdzEqLw0KICAgICAgYnJlYWs7DQogICAgZGVmYXVsdCA6DQogICAgICBicmVhazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IENoZWNrSVRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgQ0FOIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IENBTl9SZWc6IHNwZWNpZmllcyB0aGUgQ0FOIGludGVycnVwdCByZWdpc3RlciB0byBjaGVjay4NCiogICAgICAgICAgICAgICAgICBJdF9CaXQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSBiaXQgdG8gY2hlY2suDQoqIE91dHB1dCAgICAgICAgIDogTm9uZS4NCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIHRoZSBDQU4gSW50ZXJydXB0IChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyBJVFN0YXR1cyBDaGVja0lUU3RhdHVzKHUzMiBDQU5fUmVnLCB1MzIgSXRfQml0KQ0Kew0KICBJVFN0YXR1cyBwZW5kaW5nYml0c3RhdHVzID0gUkVTRVQ7DQoNCiAgaWYgKChDQU5fUmVnICYgSXRfQml0KSAhPSAodTMyKVJFU0VUKQ0KICB7DQogICAgLyogQ0FOX0lUIGlzIHNldCAqLw0KICAgIHBlbmRpbmdiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogQ0FOX0lUIGlzIHJlc2V0ICovDQogICAgcGVuZGluZ2JpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQoNCiAgcmV0dXJuIHBlbmRpbmdiaXRzdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=