LyoqIEBmaWxlDQoNCiAgQ29weXJpZ2h0IChjKSAyMDA0ICAtIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLjxCUj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQ0KICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXINDQogIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UgdGhhdCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIA0NCiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQ0KICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0NCiAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAgDQ0KICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELiAgICANDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0NCg0KDQpNb2R1bGUgTmFtZToNCg0KICBQY2hJbml0UGVpbS5jDQoNCkFic3RyYWN0Og0KDQogIERvIEVhcmx5IFBDSCBwbGF0Zm9ybSBpbml0aWFsaXphdGlvbi4NCg0KDQotLSovDQoNCiNpbmNsdWRlICJQbGF0Zm9ybUVhcmx5SW5pdC5oIg0KI2luY2x1ZGUgIlBwaS9QY2hQbGF0Zm9ybVBvbGljeS5oIg0KI2luY2x1ZGUgIlBjaFJlZ3MuaCINCiNpbmNsdWRlIDxQcGkvUGNoVXNiUG9saWN5Lmg+DQojaW5jbHVkZSAiUHBpL1BjaEluaXQuaCINCiNpbmNsdWRlIDxMaWJyYXJ5L1BjZExpYi5oPg0KDQpFRklfR1VJRCAgZ1BjaFBsYXRmb3JtUG9saWN5UHBpR3VpZCA9IFBDSF9QTEFURk9STV9QT0xJQ1lfUFBJX0dVSUQ7DQoNCiNkZWZpbmUgTUNfUE1TVFNfT0ZGU0VUICAgICAgICAgICAgICAgICAweEMNCg0KI2RlZmluZSBERUZBVUxUX0JVU19JTkZPICAgICAgICAgICAgICAgIDB4MjAyMA0KDQoNCiNkZWZpbmUgUENJX0xQQ19CQVNFICAgICgweDgwMDBGODAwKQ0KI2RlZmluZSBQQ0lfTFBDX1JFRyh4KSAgKFBDSV9MUENfQkFTRSArICh4KSkNCiNkZWZpbmUgUENJRVhfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgMHhFMDAwMDAwMA0KI2RlZmluZSBQY2lEMzFGMFJlZ0Jhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lFWF9CQVNFX0FERFJFU1MgKyAoVUlOVDMyKSAoMzEgPDwgMTUpDQoNClZPSUQNClBjaFBvbGljeVNldHVwSW5pdCAoDQogIElOIENPTlNUIEVGSV9QRUlfU0VSVklDRVMgKipQZWlTZXJ2aWNlcywNCiAgSU4gU1lTVEVNX0NPTkZJR1VSQVRJT04gICAqU3lzdGVtQ29uZmlndXJhdGlvbg0KICApOw0KDQpWT0lEDQpQY2hJbml0SW50ZXJydXB0ICgNCiAgSU4gU1lTVEVNX0NPTkZJR1VSQVRJT04gICpTeXN0ZW1Db25maWd1cmF0aW9uDQogICk7DQoNCkVGSV9TVEFUVVMNCkluc3RhbGxQZWlQY2hVc2JQb2xpY3kgKA0KICBJTiBDT05TVCAgRUZJX1BFSV9TRVJWSUNFUyAgKipQZWlTZXJ2aWNlcw0KICApOw0KDQojaWZuZGVmIF9fR05VQ19fDQojcHJhZ21hIHdhcm5pbmcgKHB1c2gpDQojcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MjQ1KQ0KI3ByYWdtYSB3YXJuaW5nIChwb3ApDQojZW5kaWYNCg0KVUlOVDgNClJlYWRDbW9zQmFuazFCeXRlICgNCiAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcw0KICApDQp7DQogIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YTsNCg0KICBJb1dyaXRlOChSX1BDSF9SVENfRVhUX0lOREVYLCBBZGRyZXNzKTsNCiAgRGF0YSA9IElvUmVhZDggKFJfUENIX1JUQ19FWFRfVEFSR0VUKTsNCiAgcmV0dXJuIERhdGE7DQp9DQoNClZPSUQNCldyaXRlQ21vc0JhbmsxQnl0ZSAoDQogIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcywNCiAgSU4gVUlOVDggICAgICAgICAgICAgICAgICAgICBEYXRhDQogICkNCnsNCiAgSW9Xcml0ZTgoUl9QQ0hfUlRDX0VYVF9JTkRFWCwgQWRkcmVzcyk7DQogIElvV3JpdGU4KFJfUENIX1JUQ19FWFRfVEFSR0VULCBEYXRhKTsNCn0NCg0KLyoqDQogIFR1cm4gb2ZmIHN5c3RlbSBpZiBuZWVkZWQuDQoNCiAgQHBhcmFtIFBlaVNlcnZpY2VzIFBvaW50ZXIgdG8gUEVJIFNlcnZpY2VzDQogIEBwYXJhbSBDcHVJbyAgICAgICBQb2ludGVyIHRvIENQVSBJL08gUHJvdG9jb2wNCg0KICBAcmV0dmFsIE5vbmUuDQoNCioqLw0KVk9JRA0KQ2hlY2tQb3dlck9mZk5vdyAoDQogIFZPSUQNCiAgKQ0Kew0KICBVSU5UMTYgIFBtMVN0czsNCg0KICAvLw0KICAvLyBSZWFkIGFuZCBjaGVjayB0aGUgQUNQSSByZWdpc3RlcnMNCiAgLy8NCiAgUG0xU3RzID0gSW9SZWFkMTYgKEFDUElfQkFTRV9BRERSRVNTICsgUl9QQ0hfQUNQSV9QTTFfU1RTKTsNCiAgaWYgKChQbTFTdHMgJiBCX1BDSF9BQ1BJX1BNMV9TVFNfUFdSQlROKSA9PSBCX1BDSF9BQ1BJX1BNMV9TVFNfUFdSQlROKSB7DQogICAgSW9Xcml0ZTE2IChBQ1BJX0JBU0VfQUREUkVTUyArIFJfUENIX0FDUElfUE0xX1NUUywgQl9QQ0hfQUNQSV9QTTFfU1RTX1BXUkJUTik7DQogICAgSW9Xcml0ZTE2IChBQ1BJX0JBU0VfQUREUkVTUyArIFJfUENIX0FDUElfUE0xX0NOVCwgVl9QQ0hfQUNQSV9QTTFfQ05UX1M1KTsNCiAgICBJb1dyaXRlMTYgKEFDUElfQkFTRV9BRERSRVNTICsgUl9QQ0hfQUNQSV9QTTFfQ05ULCBWX1BDSF9BQ1BJX1BNMV9DTlRfUzUgKyBCX1BDSF9BQ1BJX1BNMV9DTlRfU0xQX0VOKTsNCg0KICAgIC8vDQogICAgLy8gU2hvdWxkIG5vdCByZXR1cm4NCiAgICAvLw0KICAgIENwdURlYWRMb29wKCk7DQogIH0NCn0NCg0KVk9JRA0KQ2xlYXJQb3dlclN0YXRlICgNCiAgSU4gU1lTVEVNX0NPTkZJR1VSQVRJT04gICAgICAgICpTeXN0ZW1Db25maWd1cmF0aW9uDQogICkNCnsNCiAgVUlOVDggICBEYXRhODsNCiAgVUlOVDE2ICBEYXRhMTY7DQogIFVJTlQzMiAgRGF0YTMyOw0KDQogIC8vDQogIC8vIENoZWNrIGZvciBQb3dlclN0YXRlIG9wdGlvbiBmb3IgQUMgcG93ZXIgbG9zcyBhbmQgcHJvZ3JhbSB0aGUgY2hpcHNldA0KICAvLw0KDQogIC8vDQogIC8vIENsZWFyIFBXUk9LIChTZXQgdG8gQ2xlYXIpDQogIC8vDQogIE1taW9PcjMyIChQTUNfQkFTRV9BRERSRVNTICsgUl9QQ0hfUE1DX0dFTl9QTUNPTl8xLCBCX1BDSF9QTUNfR0VOX1BNQ09OX1BXUk9LX0ZMUik7DQoNCiAgLy8NCiAgLy8gQ2xlYXIgUG93ZXIgRmFpbHVyZSBCaXQgKFNldCB0byBDbGVhcikNCiAgLy8NCiAgLy8gVE9ETzogQ2hlY2sgaWYgaXQgaXMgT0sgdG8gY2xlYXIgaGVyZQ0KICAvLw0KDQogIE1taW9PcjMyIChQTUNfQkFTRV9BRERSRVNTICsgUl9QQ0hfUE1DX0dFTl9QTUNPTl8xLCBCX1BDSF9QTUNfR0VOX1BNQ09OX1NVU19QV1JfRkxSKTsNCg0KICAvLw0KICAvLyBDbGVhciB0aGUgR1BFIGFuZCBQTSBlbmFibGUNCiAgLy8NCiAgSW9Xcml0ZTE2IChBQ1BJX0JBU0VfQUREUkVTUyArIFJfUENIX0FDUElfUE0xX0VOLCAoVUlOVDE2KSAweDAwKTsNCiAgSW9Xcml0ZTMyIChBQ1BJX0JBU0VfQUREUkVTUyArIFJfUENIX0FDUElfR1BFMGFfRU4sIChVSU5UMzIpIDB4MDApOw0KDQogIC8vDQogIC8vIEhhbHQgdGhlIFRDTyB0aW1lcg0KICAvLw0KICBEYXRhMTYgPSBJb1JlYWQxNiAoQUNQSV9CQVNFX0FERFJFU1MgKyBSX1BDSF9UQ09fQ05UKTsNCiAgRGF0YTE2IHw9IEJfUENIX1RDT19DTlRfVE1SX0hMVDsNCiAgSW9Xcml0ZTE2IChBQ1BJX0JBU0VfQUREUkVTUyArIFJfUENIX1RDT19DTlQsIERhdGExNik7DQoNCiAgLy8NCiAgLy8gaWYgTk1JX05PV19TVFMgaXMgc2V0DQogIC8vIE5NSSBOT1cgYml0IGlzICJXcml0ZSAnMScgdG8gY2xlYXIiDQogIC8vDQogIERhdGE4ID0gTW1pb1JlYWQ4KElMQl9CQVNFX0FERFJFU1MgKyBSX1BDSF9JTEJfR05NSSk7DQogIGlmICgoRGF0YTggJiBCX1BDSF9JTEJfR05NSV9OTUlOUykgPT0gQl9QQ0hfSUxCX0dOTUlfTk1JTlMpIHsNCiAgICBNbWlvT3I4IChJTEJfQkFTRV9BRERSRVNTICsgUl9QQ0hfSUxCX0dOTUksIEJfUENIX0lMQl9HTk1JX05NSU4pOw0KICB9DQoNCiAgLy8NCiAgLy8gQmVmb3JlIHdlIGNsZWFyIHRoZSBUTyBzdGF0dXMgYml0IGhlcmUgd2UgbmVlZCB0byBzYXZlIHRoZSByZXN1bHRzIGluIGEgQ01PUyBiaXQgZm9yIGxhdGVyIHVzZS4NCiAgLy8NCiAgRGF0YTMyID0gSW9SZWFkMzIgKEFDUElfQkFTRV9BRERSRVNTICsgUl9QQ0hfVENPX1NUUyk7DQogIGlmICgoRGF0YTMyICYgQl9QQ0hfVENPX1NUU19TRUNPTkRfVE8pID09IEJfUENIX1RDT19TVFNfU0VDT05EX1RPKQ0KICB7DQojaWYgKGRlZmluZWQoSFdfV0FUQ0hET0dfVElNRVJfU1VQUE9SVCkgJiYgKEhXX1dBVENIRE9HX1RJTUVSX1NVUFBPUlQgIT0gMCkpDQogICAgV3JpdGVDbW9zQmFuazFCeXRlICgNCiAgICAgIEVGSV9DTU9TX1BFUkZPUk1BTkNFX0ZMQUdTLA0KICAgICAgUmVhZENtb3NCYW5rMUJ5dGUgKEVGSV9DTU9TX1BFUkZPUk1BTkNFX0ZMQUdTKSB8IEJfQ01PU19UQ09fV0RUX1JFU0VUDQogICAgICApOw0KI2VuZGlmDQogIH0NCn0NCg0KLyorKw0KDQogIENsZWFyIGFueSBTTUkgc3RhdHVzIG9yIHdha2Ugc3RhdHVzIGxlZnQgb3ZlciBmcm9tIGJvb3QuDQoNCioqLw0KVk9JRA0KQ2xlYXJTbWlBbmRXYWtlICgNCiAgVk9JRA0KICApDQp7DQogIFVJTlQxNiAgUG0xU3RzOw0KICBVSU5UMzIgIEdwZTBTdHM7DQogIFVJTlQzMiAgU21pU3RzOw0KDQogIC8vDQogIC8vIFJlYWQgdGhlIEFDUEkgcmVnaXN0ZXJzDQogIC8vDQogIFBtMVN0cyAgPSBJb1JlYWQxNiAoQUNQSV9CQVNFX0FERFJFU1MgKyBSX1BDSF9BQ1BJX1BNMV9TVFMpOw0KICBHcGUwU3RzID0gSW9SZWFkMzIgKEFDUElfQkFTRV9BRERSRVNTICsgUl9QQ0hfQUNQSV9HUEUwYV9TVFMpOw0KICBTbWlTdHMgID0gSW9SZWFkMzIgKEFDUElfQkFTRV9BRERSRVNTICsgUl9QQ0hfU01JX1NUUyk7DQoNCiAgLy8NCiAgLy8gUmVnaXN0ZXIgV2FrZSB1cCByZWFzb24gZm9yIFM0LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIG5vdGlmeQ0KICAvLyBXaW5YcCBvZiB3YWtlIHVwIHJlYXNvbiBiZWNhdXNlIFM0IHdha2UgdXAgcGF0aCBkb2Vzbid0IGtlZXAgU0NJLg0KICAvLyBUaGlzIGlzIGltcG9ydGFudCBmb3IgVmlpdihRdWljayByZXN1bWUpIHBsYXRmb3JtLg0KICAvLw0KDQogIC8vDQogIC8vIEZpcnN0IENsZWFyIENNT1MgUzQgV2FrZSB1cCBmbGFnLg0KICAvLw0KICBXcml0ZUNtb3NCYW5rMUJ5dGUoQ01PU19TNF9XQUtFVVBfRkxBR19BRERSRVNTLCAwKTsNCg0KICAvLw0KICAvLyBDaGVjayB3YWtlIHVwIHJlYXNvbiBhbmQgc2V0IENNT1MgYWNjb3JkaW5nbHkuICBDdXJyZW50bHkgY2hlY2tzDQogIC8vIFBvd2VyIGJ1dHRvbiwgVVNCLCBQUy8yLg0KICAvLyBOb3RlIDogUFMvMiB3YWtlIHVwIGlzIHVzaW5nIEdQSTEzIChJT19QTUUpLiAgVGhpcyBtdXN0IGJlIGNoYW5nZWQgZGVwZW5kaW5nDQogIC8vIG9uIGJvYXJkIGRlc2lnbi4NCiAgLy8NCiAgaWYgKChQbTFTdHMgJiBCX1BDSF9BQ1BJX1BNMV9TVFNfUFdSQlROKSB8fCAoR3BlMFN0cyAmIChCX1BDSF9BQ1BJX0dQRTBhX1NUU19DT1JFX0dQSU8gfCBCX1BDSF9BQ1BJX0dQRTBhX1NUU19TVVNfR1BJTykpKSB7DQogICAgV3JpdGVDbW9zQmFuazFCeXRlKENNT1NfUzRfV0FLRVVQX0ZMQUdfQUREUkVTUywgMSk7DQogIH0NCg0KICAvLw0KICAvLyBDbGVhciBhbnkgU01JIG9yIHdha2Ugc3RhdGUgZnJvbSB0aGUgYm9vdA0KICAvLw0KICBQbTFTdHMgPSAoQl9QQ0hfQUNQSV9QTTFfU1RTX1BSQlROT1IgfCBCX1BDSF9BQ1BJX1BNMV9TVFNfUFdSQlROKTsNCg0KICBHcGUwU3RzIHw9DQogICAgKA0KICAgICAgQl9QQ0hfQUNQSV9HUEUwYV9TVFNfQ09SRV9HUElPIHwNCiAgICAgIEJfUENIX0FDUElfR1BFMGFfU1RTX1NVU19HUElPIHwNCiAgICAgIEJfUENIX0FDUElfR1BFMGFfU1RTX1BNRV9CMCB8DQogICAgICBCX1BDSF9BQ1BJX0dQRTBhX1NUU19CQVRMT1cgfA0KICAgICAgQl9QQ0hfQUNQSV9HUEUwYV9TVFNfUENJX0VYUCB8DQogICAgICBCX1BDSF9BQ1BJX0dQRTBhX1NUU19HVU5JVF9TQ0kgfA0KICAgICAgQl9QQ0hfQUNQSV9HUEUwYV9TVFNfUFVOSVRfU0NJIHwNCiAgICAgIEJfUENIX0FDUElfR1BFMGFfU1RTX1NXR1BFIHwNCiAgICAgIEJfUENIX0FDUElfR1BFMGFfU1RTX0hPVF9QTFVHDQogICAgKTsNCg0KICBTbWlTdHMgfD0NCiAgICAoDQogICAgICBCX1BDSF9TTUlfU1RTX1NNQlVTIHwNCiAgICAgIEJfUENIX1NNSV9TVFNfUEVSSU9ESUMgfA0KICAgICAgQl9QQ0hfU01JX1NUU19UQ08gfA0KICAgICAgQl9QQ0hfU01JX1NUU19TV1NNSV9UTVIgfA0KICAgICAgQl9QQ0hfU01JX1NUU19BUE0gfA0KICAgICAgQl9QQ0hfU01JX1NUU19PTl9TTFBfRU4gfA0KICAgICAgQl9QQ0hfU01JX1NUU19CSU9TDQogICAgKTsNCg0KICAvLw0KICAvLyBXcml0ZSB0aGVtIGJhY2sNCiAgLy8NCiAgSW9Xcml0ZTE2IChBQ1BJX0JBU0VfQUREUkVTUyArIFJfUENIX0FDUElfUE0xX1NUUywgUG0xU3RzKTsNCiAgSW9Xcml0ZTMyIChBQ1BJX0JBU0VfQUREUkVTUyArIFJfUENIX0FDUElfR1BFMGFfU1RTLCBHcGUwU3RzKTsNCiAgSW9Xcml0ZTMyIChBQ1BJX0JBU0VfQUREUkVTUyArIFJfUENIX1NNSV9TVFMsIFNtaVN0cyk7DQp9DQoNCi8qKg0KICBJc3N1ZSBQQ0ktRSBTZWNvbmRhcnkgQnVzIFJlc2V0DQoNCiAgQHBhcmFtIEJ1cyAgQnVzIG51bWJlciBvZiB0aGUgYnJpZGdlDQogIEBwYXJhbSBEZXYgIERldmljZXMgbnVtYmVyIG9mIHRoZSBicmlkZ2UNCiAgQHBhcmFtIEZ1biAgRnVuY3Rpb24gbnVtYmVyIG9mIHRoZSBicmlkZ2UNCg0KICBAcmV0dmFsIEVGSV9TVUNDRVNTDQoNCioqLw0KRUZJX1NUQVRVUw0KUGNpZVNlY29uZGFyeUJ1c1Jlc2V0ICgNCiAgSU4gQ09OU1QgRUZJX1BFSV9TRVJWSUNFUyAgKipQZWlTZXJ2aWNlcywNCiAgSU4gVUlOVDggICAgICAgICAgICAgQnVzLA0KICBJTiBVSU5UOCAgICAgICAgICAgICBEZXYsDQogIElOIFVJTlQ4ICAgICAgICAgICAgIEZ1bg0KICApDQp7DQogIEVGSV9QRUlfU1RBTExfUFBJICAgKlBlaVN0YWxsOw0KICBFRklfU1RBVFVTICAgICAgICAgIFN0YXR1czsNCg0KICBTdGF0dXMgPSAoKipQZWlTZXJ2aWNlcykuTG9jYXRlUHBpICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVpU2VydmljZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnRWZpUGVpU3RhbGxQcGlHdWlkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLA0KICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikmUGVpU3RhbGwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgQVNTRVJUX0VGSV9FUlJPUiAoU3RhdHVzKTsNCg0KICAvLw0KICAvLyBJc3N1ZSBzZWNvbmRhcnkgYnVzIHJlc2V0DQogIC8vDQogIE1tUGNpMTZPcigwLCBCdXMsIERldiwgRnVuLCBQQ0lfQlJJREdFX0NPTlRST0xfUkVHSVNURVJfT0ZGU0VULCBFRklfUENJX0JSSURHRV9DT05UUk9MX1JFU0VUX1NFQ09OREFSWV9CVVMpOw0KDQogIC8vDQogIC8vIFdhaXQgMW1zDQogIC8vDQogIFBlaVN0YWxsLT5TdGFsbCAoUGVpU2VydmljZXMsIFBlaVN0YWxsLCAxMDAwKTsNCg0KDQogIC8vDQogIC8vIENsZWFyIHRoZSByZXNldCBiaXQNCiAgLy8gTm90ZTogVGhlIFBDSWUgc3BlYyBzdWdnZXN0cyAxMDBtcyBkZWxheSBiZXR3ZWVuIGNsZWFyaW5nIHRoaXMgYml0IGFuZCBhY2Nlc3NpbmcNCiAgLy8gdGhlIGRldmljZSdzIGNvbmZpZyBzcGFjZS4gU2luY2Ugd2Ugd2lsbCBub3QgYWNjZXNzIHRoZSBjb25maWcgc3BhY2UgdW50aWwgd2UgZW50ZXIgRFhFDQogIC8vIHdlIGRvbid0IHB1dCBkZWxheSBleHByZXNzbHkgaGVyZS4NCiAgLy8NCiAgTW1QY2kxNkFuZCgwLCBCdXMsIERldiwgRnVuLCBQQ0lfQlJJREdFX0NPTlRST0xfUkVHSVNURVJfT0ZGU0VULCB+KEVGSV9QQ0lfQlJJREdFX0NPTlRST0xfUkVTRVRfU0VDT05EQVJZX0JVUykpOw0KDQogIHJldHVybiBFRklfU1VDQ0VTUzsNCn0NCg0KLyoqDQogIFByb3ZpZGUgaGFyZCByZXNldCBQUEkgc2VydmljZS4NCiAgVG8gZ2VuZXJhdGUgZnVsbCBoYXJkIHJlc2V0LCB3cml0ZSAweDBFIHRvIElDSCBSRVNFVF9HRU5FUkFUT1JfUE9SVCAoMHhDRjkpLg0KDQogIEBwYXJhbSBQZWlTZXJ2aWNlcyAgICAgICAgR2VuZXJhbCBwdXJwb3NlIHNlcnZpY2VzIGF2YWlsYWJsZSB0byBldmVyeSBQRUlNLg0KDQogIEByZXR2YWwgTm90IHJldHVybiAgICAgICAgU3lzdGVtIHJlc2V0IG9jY3VyZWQuDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgRGV2aWNlIGVycm9yLCBjb3VsZCBub3QgcmVzZXQgdGhlIHN5c3RlbS4NCg0KKiovDQpFRklfU1RBVFVTDQpFRklBUEkNCkljaFJlc2V0ICgNCiAgSU4gQ09OU1QgRUZJX1BFSV9TRVJWSUNFUyAgICAgICAgICAqKlBlaVNlcnZpY2VzDQogICkNCnsNCiAgSW9Xcml0ZTggKA0KICAgIFJfUENIX1JTVF9DTlQsDQogICAgVl9QQ0hfUlNUX0NOVF9IQVJEU1RBUlRTVEFURQ0KICAgICk7DQoNCiAgSW9Xcml0ZTggKA0KICAgIFJfUENIX1JTVF9DTlQsDQogICAgVl9QQ0hfUlNUX0NOVF9IQVJEUkVTRVQNCiAgICApOw0KDQogIC8vDQogIC8vIFN5c3RlbSByZXNldCBvY2N1cmVkLCBzaG91bGQgbmV2ZXIgcmVhY2ggYXQgdGhpcyBsaW5lLg0KICAvLw0KICBBU1NFUlRfRUZJX0VSUk9SIChFRklfREVWSUNFX0VSUk9SKTsNCiAgQ3B1RGVhZExvb3AoKTsNCg0KICByZXR1cm4gRUZJX0RFVklDRV9FUlJPUjsNCn0NCg0KVk9JRA0KUGNoUGxhdGZvcm1McGNJbml0ICgNCiAgSU4gIENPTlNUIEVGSV9QRUlfU0VSVklDRVMgICAgICAgICAgKipQZWlTZXJ2aWNlcywNCiAgSU4gU1lTVEVNX0NPTkZJR1VSQVRJT04gICAgICAgKlN5c3RlbUNvbmZpZ3VyYXRpb24NCiAgKQ0Kew0KICBFRklfQk9PVF9NT0RFIEJvb3RNb2RlOw0KICBVSU5UOCAgICAgICAgIERhdGE4Ow0KICBVSU5UMTYgICAgICAgICAgICAgICAgRGF0YTE2Ow0KDQogICgqUGVpU2VydmljZXMpLT5HZXRCb290TW9kZShQZWlTZXJ2aWNlcywgJkJvb3RNb2RlKTsNCg0KICBpZiAoKEJvb3RNb2RlICE9IEJPT1RfT05fUzNfUkVTVU1FKSkgew0KDQogICAgLy8NCiAgICAvLyBDbGVhciBhbGwgcGVuZGluZyBTTUkuIE9uIFMzIGNsZWFyIHBvd2VyIGJ1dHRvbiBlbmFibGUgc28gaXQgd2xsIG5vdCBnZW5lcmF0ZSBhbiBTTUkNCiAgICAvLw0KICAgIENsZWFyU21pQW5kV2FrZSAoKTsNCiAgfQ0KDQogIENsZWFyUG93ZXJTdGF0ZSAoU3lzdGVtQ29uZmlndXJhdGlvbik7DQoNCiAgLy8NCiAgLy8gTmVlZCB0byBzZXQgYW5kIGNsZWFyIFNFVCBiaXQgKFJUQ19SRUdCIEJpdCA3KSBhcyByZXF1ZXN0ZWQgYnkgdGhlIElDSCBFRFMNCiAgLy8gZWFybHkgaW4gUE9TVCBhZnRlciBlYWNoIHBvd2VyIHVwIGRpcmVjdGx5IGFmdGVyIGNvaW4tY2VsbCBiYXR0ZXJ5IGluc2VydGlvbi4NCiAgLy8gVGhpcyBpcyB0byBhdm9pZCB0aGUgVUlQIGJpdCAoUlRDX1JFR0EgQml0IDcpIGZyb20gc3R1Y2sgYXQgIjEiLg0KICAvLyBUaGUgVUlQIGJpdCBzdGF0dXMgbWF5IGJlIHBvbGxlZCBieSBzb2Z0d2FyZSAoaS5lIE1FIEZXKSBkdXJpbmcgUE9TVC4NCiAgLy8NCiAgaWYgKE1taW9SZWFkOCAoUE1DX0JBU0VfQUREUkVTUyArIFJfUENIX1BNQ19HRU5fUE1DT05fMSkgJiBCX1BDSF9QTUNfR0VOX1BNQ09OX1JUQ19QV1JfU1RTKSB7DQogIAkvLw0KICAgIC8vIFNldCBhbmQgY2xlYXIgU0VUIGJpdCBpbiBSVENfUkVHQg0KICAgIC8vDQogICAgSW9Xcml0ZTgoUl9QQ0hfUlRDX0lOREVYLCBSX1BDSF9SVENfUkVHSVNURVJCKTsNCiAgICBEYXRhOCA9IElvUmVhZDgoUl9QQ0hfUlRDX1RBUkdFVCk7DQogICAgRGF0YTggfD0gQl9QQ0hfUlRDX1JFR0lTVEVSQl9TRVQ7DQogICAgSW9Xcml0ZTgoUl9QQ0hfUlRDX1RBUkdFVCwgRGF0YTgpOw0KDQogICAgSW9Xcml0ZTgoUl9QQ0hfUlRDX0lOREVYLCBSX1BDSF9SVENfUkVHSVNURVJCKTsNCiAgICBEYXRhOCAmPSAofkJfUENIX1JUQ19SRUdJU1RFUkJfU0VUKTsNCiAgICBJb1dyaXRlOChSX1BDSF9SVENfVEFSR0VULCBEYXRhOCk7DQoNCiAgICAvLw0KICAgIC8vIENsZWFyIHRoZSBVSVAgYml0IGluIFJUQ19SRUdBDQogICAgLy8NCiAgICBJb1dyaXRlOChSX1BDSF9SVENfSU5ERVgsIFJfUENIX1JUQ19SRUdJU1RFUkEpOw0KICAgIElvV3JpdGU4KFJfUENIX1JUQ19UQVJHRVQsIDB4MDApOw0KICB9DQoNCiAgLy8NCiAgLy8gRGlzYWJsZSBTRVJSIE5NSSBhbmQgSU9DSEsjIE5NSSBpbiBwb3J0IDYxDQogIC8vDQogIERhdGE4ID0gSW9SZWFkOCAoUl9QQ0hfTk1JX1NDKTsNCiAgSW9Xcml0ZTgoUl9QQ0hfTk1JX1NDLCAoVUlOVDgpIChEYXRhOCB8IEJfUENIX05NSV9TQ19QQ0lfU0VSUl9FTiB8IEJfUENIX05NSV9TQ19JT0NIS19OTUlfRU4pKTsNCg0KICAvLw0KICAvLyBFbmFibGUgQnVzIE1hc3RlciwgSS9PLCBNZW0sIGFuZCBTRVJSIG9uIExQQyBicmlkZ2UNCiAgLy8NCiAgRGF0YTE2ID0gUGNoTHBjUGNpQ2ZnMTYgKFJfUENIX0xQQ19DT01NQU5EKTsNCiAgTW1pb1dyaXRlMTYgKA0KICAgIE1tUGNpQWRkcmVzcyAoMCwNCiAgICAgIERFRkFVTFRfUENJX0JVU19OVU1CRVJfUENILA0KICAgICAgUENJX0RFVklDRV9OVU1CRVJfUENIX0xQQywNCiAgICAgIFBDSV9GVU5DVElPTl9OVU1CRVJfUENIX0xQQywNCiAgICAgIFJfUENIX0xQQ19DT01NQU5EDQogICAgKSwNCiAgICAoRGF0YTE2IHwNCiAgICAgQl9QQ0hfTFBDX0NPTU1BTkRfSU9TRSB8DQogICAgIEJfUENIX0xQQ19DT01NQU5EX01TRSB8DQogICAgIEJfUENIX0xQQ19DT01NQU5EX0JNRSB8DQogICAgIEJfUENIX0xQQ19DT01NQU5EX1NFUlJfRU4pDQogICk7DQoNCiAgLy8NCiAgLy8gU2V0IFN0cmV0Y2ggUzQgdG8gMS0ycyBwZXIgbWFya2V0aW5nIHJlcXVlc3QuDQogIC8vIE5vdGU6IFRoaXMgcmVnaXN0ZXIgaXMgcG93ZXJlZCBieSBSVEMgd2VsbC4NCiAgLy8NCiAgTW1pb0FuZFRoZW5PcjggKA0KICAgIFBNQ19CQVNFX0FERFJFU1MgKyBSX1BDSF9QTUNfR0VOX1BNQ09OXzEgLA0KICAgIChVSU5UOCkgKH5CX1BDSF9QTUNfR0VOX1BNQ09OX1NMUF9TNF9NQVcpLA0KICAgIChVSU5UOCkgKEJfUENIX1BNQ19HRU5fUE1DT05fU0xQX1M0X0FTRSB8IFZfUENIX1BNQ19HRU5fUE1DT05fU0xQX1M0X01BV180UykNCiAgICApOw0KDQp9DQoNCiNkZWZpbmUgVl9QQ0hfSUxCX0lSUUVfVUFSVElSUUVOX0lSUTMgICAgICAgICAgICAgQklUMyAvLyBVQVJUIElSUTMgRW5hYmxlDQoNClZPSUQNClVBUlRJbml0ICgNCiAgSU4gU1lTVEVNX0NPTkZJR1VSQVRJT04gICAgICAgICpTeXN0ZW1Db25maWd1cmF0aW9uDQogICkNCnsNCiAgaWYgKDApIHsgLy8gZm9yIGZpeCBjcjQgaXNzdWUNCiAgICAvLw0KICAgIC8vIFByb2dyYW0gYW5kIGVuYWJsZSBQTUMgQmFzZS4NCiAgICAvLw0KICAgIElvV3JpdGUzMiAoMHhDRjgsICBQQ0lfTFBDX1JFRyhSX1BDSF9MUENfUE1DX0JBU0UpKTsNCiAgICBJb1dyaXRlMzIgKDB4Q0ZDLCAgKFBNQ19CQVNFX0FERFJFU1MgfCBCX1BDSF9MUENfUE1DX0JBU0VfRU4pKTsNCg0KICAgIGlmKCAoU3lzdGVtQ29uZmlndXJhdGlvbi0+UGN1VWFydDEgPT0gMSkgJiYNCiAgICAgICAgKFN5c3RlbUNvbmZpZ3VyYXRpb24tPkxwc3NIc3VhcnQwRW5hYmxlZCA9PSAwKSl7DQogICAgICAvLw0KICAgICAgLy8gRW5hYmxlIENPTTEgZm9yIGRlYnVnIG1lc3NhZ2Ugb3V0cHV0Lg0KICAgICAgLy8NCiAgICAgIE1taW9PcjMyIChQTUNfQkFTRV9BRERSRVNTICsgUl9QQ0hfUE1DX0dFTl9QTUNPTl8xLCBCSVQyNCk7DQoNCiAgICAgIC8vDQogICAgICAvL0VuYWJsZSBpbnRlcm5hbCBVQVJUMyBwb3J0KENPTTEpDQogICAgICAvLw0KICAgICAgTW1pb09yOCAoSUxCX0JBU0VfQUREUkVTUyArIFJfUENIX0lMQl9JUlFFLCAoVUlOVDgpIFZfUENIX0lMQl9JUlFFX1VBUlRJUlFFTl9JUlEzKTsNCiAgICAgIE1taW9PcjMyIChJT19CQVNFX0FERFJFU1MgKyAweDA1MjAsIDB4MDEpOyAvLyBVQVJUM19SWEQtTA0KICAgICAgTW1pb09yMzIgKElPX0JBU0VfQUREUkVTUyArIDB4MDUzMCwgMHgwMSk7IC8vIFVBUlQzX1RYRC0wDQogICAgICBNbWlvT3I4IChQY2lEMzFGMFJlZ0Jhc2UgKyBSX1BDSF9MUENfVUFSVF9DVFJMLCAoVUlOVDgpIEJfUENIX0xQQ19VQVJUX0NUUkxfQ09NMV9FTik7DQogICAgfSBlbHNlIHsNCiAgICAJLy8NCiAgICAgIC8vRGlzYWJsZSBVQVJUMyhDT00xKQ0KICAgICAgLy8NCiAgICAgIE1taW9BbmQ4IChJTEJfQkFTRV9BRERSRVNTICsgUl9QQ0hfSUxCX0lSUUUsIChVSU5UOCkgflZfUENIX0lMQl9JUlFFX1VBUlRJUlFFTl9JUlEzKTsNCiAgICAgIE1taW9BbmQzMiAoSU9fQkFTRV9BRERSRVNTICsgMHgwNTIwLCB+KFVJTlQzMikweDA3KTsNCiAgICAgIE1taW9BbmQzMiAoSU9fQkFTRV9BRERSRVNTICsgMHgwNTMwLCB+KFVJTlQzMikweDA3KTsNCiAgICAgIE1taW9BbmQ4IChQY2lEMzFGMFJlZ0Jhc2UgKyBSX1BDSF9MUENfVUFSVF9DVFJMLCAoVUlOVDgpIH5CX1BDSF9MUENfVUFSVF9DVFJMX0NPTTFfRU4pOw0KDQoNCiAgICAgIGlmIChTeXN0ZW1Db25maWd1cmF0aW9uLT5McHNzSHN1YXJ0MEVuYWJsZWQgPT0gMSl7DQogICAgICAgIC8vDQogICAgICAgIC8vVmFsbGV5dmlldyBCSU9TIFNwZWNpZmljYXRpb24gVm9sMiwxNy4yDQogICAgICAgIC8vTFBTU19VQVJUMSCoQyBzZXQgZWFjaCBwYWQgUEFEX0NPTkYwLkZ1bmNfUGluX011eCB0byBmdW5jdGlvbiAxOg0KICAgICAgICAvLw0KICAgICAgICBNbWlvQW5kOCAoSU9fQkFTRV9BRERSRVNTICsgMHgwMDkwLCAoVUlOVDgpfjB4MDcpOw0KICAgICAgICBNbWlvT3I4IChJT19CQVNFX0FERFJFU1MgKyAweDAwOTAsIDB4MDEpOw0KICAgICAgICBNbWlvQW5kOCAoSU9fQkFTRV9BRERSRVNTICsgMHgwMEQwLCAoVUlOVDgpfjB4MDcpOw0KICAgICAgICBNbWlvT3I4IChJT19CQVNFX0FERFJFU1MgKyAweDAwRDAsIDB4MDEpOw0KDQogICAgICB9DQogICAgfQ0KDQoNCiAgICBERUJVRyAoKEVGSV9EX0VSUk9SLCAiRW5hYmxlSW50ZXJuYWxVYXJ0XG4iKSk7DQogIH0gZWxzZSB7DQogIAkvLw0KICAgIC8vIElmIFNJTyBVQVJUIGludGVyZmFjZSBzZWxlY3RlZA0KICAgIC8vRGlzYWJsZSBpbnRlcm5hbCBVQVJUIHBvcnQoQ09NMSkNCiAgICAvLw0KICAgIGlmICgwKSB7OyAvLyBGb3IgZml4IENSNCBpc3N1ZQ0KICAgICAgTW1pb0FuZDggKElMQl9CQVNFX0FERFJFU1MgKyBSX1BDSF9JTEJfSVJRRSwgKFVJTlQ4KSB+Vl9QQ0hfSUxCX0lSUUVfVUFSVElSUUVOX0lSUTMpOw0KICAgICAgTW1pb0FuZDggKElPX0JBU0VfQUREUkVTUyArIDB4MDA5MCwgKFVJTlQ4KX4weDA3KTsNCiAgICAgIE1taW9BbmQ4IChJT19CQVNFX0FERFJFU1MgKyAweDAwRDAsIChVSU5UOCl+MHgwNyk7DQogICAgICBNbWlvQW5kOCAoUGNpRDMxRjBSZWdCYXNlICsgUl9QQ0hfTFBDX1VBUlRfQ1RSTCwgKFVJTlQ4KSB+Ql9QQ0hfTFBDX1VBUlRfQ1RSTF9DT00xX0VOKTsNCg0KICAgIH0NCiAgfQ0KfQ0KDQpWT0lEDQpJY2hSY3JiSW5pdCAoDQogIElOIENPTlNUIEVGSV9QRUlfU0VSVklDRVMgICAgICAgICAgICAqKlBlaVNlcnZpY2VzLA0KICBJTiBTWVNURU1fQ09ORklHVVJBVElPTiAgICAgICAgKlN5c3RlbUNvbmZpZ3VyYXRpb24NCiAgKQ0Kew0KICBFRklfQk9PVF9NT0RFICAgICAgICAgICAgICAgICAgIEJvb3RNb2RlOw0KDQogICgqUGVpU2VydmljZXMpLT5HZXRCb290TW9kZShQZWlTZXJ2aWNlcywgJkJvb3RNb2RlKTsNCg0KICAvLw0KICAvLyBJZiBub3QgcmVjb3Zlcnkgb3IgZmxhc2ggdXBkYXRlIGJvb3QgcGF0aC4gc2V0IHRoZSBCSU9TIGludGVyZmFjZSBsb2NrIGRvd24gYml0Lg0KICAvLyBJdCBsb2NrcyB0aGUgdG9wIHN3YXAgYml0IGFuZCBCSU9TIGJvb3Qgc3RyYXAgYml0cyBmcm9tIGJlaW5nIGNoYW5nZWQuDQogIC8vDQogIGlmICgoQm9vdE1vZGUgIT0gQk9PVF9JTl9SRUNPVkVSWV9NT0RFKSAmJiAoQm9vdE1vZGUgIT0gQk9PVF9PTl9GTEFTSF9VUERBVEUpKSB7DQogICAgTW1pb09yOCAoUkNCQV9CQVNFX0FERFJFU1MgKyBSX1BDSF9SQ1JCX0dDUywgQl9QQ0hfUkNSQl9HQ1NfQklMRCk7DQogIH0NCg0KICAvLw0KICAvLyBEaXNhYmxlIHRoZSBXYXRjaGRvZyB0aW1lciBleHBpcmF0aW9uIGZyb20gY2F1c2luZyBhIHN5c3RlbSByZXNldA0KICAvLw0KICBNbWlvT3I4IChQTUNfQkFTRV9BRERSRVNTICsgUl9QQ0hfUE1DX1BNX0NGRywgQl9QQ0hfUE1DX1BNX0NGR19OT19SRUJPT1QpOw0KDQogIC8vDQogIC8vIEluaXRpYWwgUkNCQSBhY2NvcmRpbmcgdG8gdGhlIFBlaVJDQkEgdGFibGUNCiAgLy8NCiAgaWYgKChCb290TW9kZSA9PSBCT09UX09OX1MzX1JFU1VNRSkpIHsNCiAgICAvLw0KICAgIC8vIFdlIGFyZSByZXN1bWluZyBmcm9tIFMzDQogICAgLy8gRW5hYmxlIEhQRVQgaWYgZW5hYmxlZCBpbiBTZXR1cA0KICAgIC8vIElDSCBDb25maWcgcmVnaXN0ZXIgT2Zmc2V0IDB4MzQwNCBiaXQgNyAoRW5hYmxlKSA9IDEsDQogICAgLy8gQml0IDE6MCAoTWVtIEkvTyBhZGRyZXNzKSA9IDAgKDB4RkVEMDAwMDApDQogICAgLy8NCiAgICBNbWlvT3I4IChSX1BDSF9QQ0hfSFBFVCArIFJfUENIX1BDSF9IUEVUX0dDRkcsIEJfUENIX1BDSF9IUEVUX0dDRkdfRU4pOw0KDQogIH0NCg0KfQ0KDQoNCkVGSV9TVEFUVVMNClBsYXRmb3JtUGNoSW5pdCAoDQogIElOIFNZU1RFTV9DT05GSUdVUkFUSU9OICAgICAgICAqU3lzdGVtQ29uZmlndXJhdGlvbiwNCiAgSU4gQ09OU1QgRUZJX1BFSV9TRVJWSUNFUyAgICAgICoqUGVpU2VydmljZXMsDQogIElOIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVR5cGUNCiAgKQ0Kew0KICBFRklfU1RBVFVTICAgICBTdGF0dXM7DQogIEVGSV9CT09UX01PREUgIEJvb3RNb2RlOw0KDQogIFN0YXR1cyA9IFBlaVNlcnZpY2VzR2V0Qm9vdE1vZGUgKCZCb290TW9kZSk7DQogIEFTU0VSVF9FRklfRVJST1IgKFN0YXR1cyk7DQoNCiAgSWNoUmNyYkluaXQgKFBlaVNlcnZpY2VzLCBTeXN0ZW1Db25maWd1cmF0aW9uKTsNCg0KICBpZiAoQm9vdE1vZGUgPT0gQk9PVF9JTl9SRUNPVkVSWV9NT0RFKSB7DQogICAgSW5zdGFsbFBlaVBjaFVzYlBvbGljeShQZWlTZXJ2aWNlcyk7DQogIH0NCg0KICAvLw0KICAvLyBQQ0ggUG9saWN5IEluaXRpYWxpemF0aW9uIGJhc2VkIG9uIFNldHVwIHZhcmlhYmxlLg0KICAvLw0KICBQY2hQb2xpY3lTZXR1cEluaXQgKFBlaVNlcnZpY2VzLCBTeXN0ZW1Db25maWd1cmF0aW9uKTsNCg0KICBVQVJUSW5pdChTeXN0ZW1Db25maWd1cmF0aW9uKTsNCg0KICBQY2hQbGF0Zm9ybUxwY0luaXQgKFBlaVNlcnZpY2VzLCBTeXN0ZW1Db25maWd1cmF0aW9uKTsNCg0KICByZXR1cm4gRUZJX1NVQ0NFU1M7DQp9DQoNCi8qKg0KDQogIFJldHVybnMgdGhlIHN0YXRlIG9mIEExNiBpbnZlcnNpb24NCg0KICBAcmV0dmFsIFRSVUUgICAgQTE2IGlzIGludmVydGVkDQogIEByZXR2YWwgRkFMU0UgICBBMTYgaXMgbm90IGludmVydGVkDQoNCioqLw0KQk9PTEVBTg0KSXNBMTZJbnZlcnRlZCAoDQogICkNCnsNCiAgVUlOVDggIERhdGE7DQogIERhdGEgPSBNbWlvUmVhZDggKFJDQkFfQkFTRV9BRERSRVNTICsgUl9QQ0hfUkNSQl9HQ1MpOw0KICByZXR1cm4gKERhdGEgJiBCX1BDSF9SQ1JCX0dDU19UUykgPyBUUlVFIDogRkFMU0U7DQp9DQoNClZPSUQNClBjaFBvbGljeVNldHVwSW5pdCAoDQogIElOIENPTlNUIEVGSV9QRUlfU0VSVklDRVMgKipQZWlTZXJ2aWNlcywNCiAgSU4gU1lTVEVNX0NPTkZJR1VSQVRJT04gICAqU3lzdGVtQ29uZmlndXJhdGlvbg0KICApDQp7DQogIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgICBTdGF0dXM7DQogIEVGSV9QRUlfUFBJX0RFU0NSSVBUT1IgICAgICAqUGNoUGxhdGZvcm1Qb2xpY3lQcGlEZXNjOw0KICBQQ0hfUExBVEZPUk1fUE9MSUNZX1BQSSAgICAgKlBjaFBsYXRmb3JtUG9saWN5UHBpOw0KICBQQ0hfSFBFVF9DT05GSUcgICAgICAgICAgICAgKkhwZXRDb25maWc7DQogIFBDSF9QQ0lFX0NPTkZJRyAgICAgICAgICAgICAqUGNpZUNvbmZpZzsNCiAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgIEluZGV4Ow0KICBQQ0hfSU9BUElDX0NPTkZJRyAgICAgICAgICAgKklvQXBpY0NvbmZpZzsNCiAgUENIX0xQU1NfQ09ORklHICAgICAgICAgICAgICpMcHNzQ29uZmlnOw0KICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgU3BpSHNmc1JlZzsNCiAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIFNwaUZkb2RSZWc7DQoNCi8vDQovLyBEaXNhYmxlIGNvZGVjIEFMQy0yNjINCi8vDQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBJb0Jhc2U7DQoNCiAgLy8NCiAgLy8gSW5zdGFsbCBQY2ggUGxhdGZvcm0gUG9saWN5IFBQSS4gQXMgd2UgZGVwZW5kIG9uIFBjaCBJbml0IFBQSSBzbyB3ZSBhcmUgZXhlY3V0ZWQgYWZ0ZXINCiAgLy8gUGNoSW5pdCBQRUlNLiBUaHVzIHdlIGNhbiBpbnN1cmUgUENIIEluaXRpYWxpemF0aW9uIGlzIHBlcmZvcm1lZCB3aGVuIHdlIGluc3RhbGwgdGhlIFBjaCBQbGF0Zm9ybSBQb2xpY3kgUFBJLA0KICAvLyBhcyBQY2hJbml0IFBFSU0gcmVnaXN0ZXJlZCBhIG5vdGlmaWNhdGlvbiBmdW5jdGlvbiBvbiBvdXIgcG9saWN5IFBQSS4NCiAgLy8NCiAgLy8gLS1jci0tIEZvciBiZXR0ZXIgY29kZSBzdHJ1Y3R1cmUgLyBtb2R1bGFyaXR5LCB3ZSBzaG91bGQgdXNlIGEgbm90aWZpY2F0aW9uIGZ1bmN0aW9uIG9uIFBjaCBJbml0IFBQSSB0byBwZXJmb3JtDQogIC8vIGFjdGlvbnMgdGhhdCBkZXBlbmQgb24gUGNoSW5pdCBQRUlNJ3MgaW5pdGlhbGl6YXRpb24uDQogIC8vDQogIC8vVG9kbzogY29uZmlybSBpZiB3ZSBuZWVkIHVwZGF0ZSB0byBQQ0hfUExBVEZPUk1fUE9MSUNZX1BQSV9SRVZJU0lPTl81DQogIC8vDQogIERFQlVHICgoRUZJX0RfRVJST1IsICJQY2hQb2xpY3lTZXR1cEluaXQoKSAtIFN0YXJ0XG4iKSk7DQoNCiAgU3RhdHVzID0gKCpQZWlTZXJ2aWNlcyktPkFsbG9jYXRlUG9vbCAoUGVpU2VydmljZXMsIHNpemVvZiAoRUZJX1BFSV9QUElfREVTQ1JJUFRPUiksICh2b2lkICoqKSZQY2hQbGF0Zm9ybVBvbGljeVBwaURlc2MpOw0KICBBU1NFUlRfRUZJX0VSUk9SIChTdGF0dXMpOw0KDQogIFN0YXR1cyA9ICgqUGVpU2VydmljZXMpLT5BbGxvY2F0ZVBvb2wgKFBlaVNlcnZpY2VzLCBzaXplb2YgKFBDSF9QTEFURk9STV9QT0xJQ1lfUFBJKSwgKHZvaWQgKiopJlBjaFBsYXRmb3JtUG9saWN5UHBpKTsNCiAgQVNTRVJUX0VGSV9FUlJPUiAoU3RhdHVzKTsNCg0KICBTdGF0dXMgPSAoKlBlaVNlcnZpY2VzKS0+QWxsb2NhdGVQb29sIChQZWlTZXJ2aWNlcywgc2l6ZW9mIChQQ0hfSFBFVF9DT05GSUcpLCAodm9pZCAqKikmSHBldENvbmZpZyk7DQogIEFTU0VSVF9FRklfRVJST1IgKFN0YXR1cyk7DQoNCiAgU3RhdHVzID0gKCpQZWlTZXJ2aWNlcyktPkFsbG9jYXRlUG9vbCAoUGVpU2VydmljZXMsIHNpemVvZiAoUENIX1BDSUVfQ09ORklHKSwgKHZvaWQgKiopJlBjaWVDb25maWcpOw0KICBBU1NFUlRfRUZJX0VSUk9SIChTdGF0dXMpOw0KDQogIFN0YXR1cyA9ICgqUGVpU2VydmljZXMpLT5BbGxvY2F0ZVBvb2wgKFBlaVNlcnZpY2VzLCBzaXplb2YgKFBDSF9JT0FQSUNfQ09ORklHKSwgKHZvaWQgKiopJklvQXBpY0NvbmZpZyk7DQogIEFTU0VSVF9FRklfRVJST1IgKFN0YXR1cyk7DQoNCiAgU3RhdHVzID0gKCpQZWlTZXJ2aWNlcyktPkFsbG9jYXRlUG9vbCAoUGVpU2VydmljZXMsIHNpemVvZiAoUENIX0xQU1NfQ09ORklHKSwgKHZvaWQgKiopJkxwc3NDb25maWcpOw0KICBBU1NFUlRfRUZJX0VSUk9SIChTdGF0dXMpOw0KDQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5SZXZpc2lvbiAgICAgICAgICAgICAgICA9IFBDSF9QTEFURk9STV9QT0xJQ1lfUFBJX1JFVklTSU9OXzE7DQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5CdXNOdW1iZXIgICAgICAgICAgICAgICA9IERFRkFVTFRfUENJX0JVU19OVU1CRVJfUENIOw0KICBQY2hQbGF0Zm9ybVBvbGljeVBwaS0+U3BpQmFzZSAgICAgICAgICAgICAgICAgPSBTUElfQkFTRV9BRERSRVNTOw0KICBQY2hQbGF0Zm9ybVBvbGljeVBwaS0+UG1jQmFzZSAgICAgICAgICAgICAgICAgPSBQTUNfQkFTRV9BRERSRVNTOw0KICBQY2hQbGF0Zm9ybVBvbGljeVBwaS0+SW9CYXNlICAgICAgICAgICAgICAgICAgPSBJT19CQVNFX0FERFJFU1M7DQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5JbGJCYXNlICAgICAgICAgICAgICAgICA9IElMQl9CQVNFX0FERFJFU1M7DQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5QVW5pdEJhc2UgICAgICAgICAgICAgICA9IFBVTklUX0JBU0VfQUREUkVTUzsNCiAgUGNoUGxhdGZvcm1Qb2xpY3lQcGktPk1waHlCYXNlICAgICAgICAgICAgICAgID0gTVBIWV9CQVNFX0FERFJFU1M7DQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5SY2JhICAgICAgICAgICAgICAgICAgICA9IFJDQkFfQkFTRV9BRERSRVNTOw0KICBQY2hQbGF0Zm9ybVBvbGljeVBwaS0+QWNwaUJhc2UgICAgICAgICAgICAgICAgPSBBQ1BJX0JBU0VfQUREUkVTUzsNCiAgUGNoUGxhdGZvcm1Qb2xpY3lQcGktPkdwaW9CYXNlICAgICAgICAgICAgICAgID0gR1BJT19CQVNFX0FERFJFU1M7DQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5TYXRhTW9kZSAgICAgICAgICAgICAgICA9IFN5c3RlbUNvbmZpZ3VyYXRpb24tPlNhdGFUeXBlOw0KICBQY2hQbGF0Zm9ybVBvbGljeVBwaS0+RW5hYmxlUm1oICAgICAgICAgICAgICAgPSBTeXN0ZW1Db25maWd1cmF0aW9uLT5QY2hVc2JSbWg7DQoNCiAgUGNoUGxhdGZvcm1Qb2xpY3lQcGktPkVoY2lQbGxDZmdFbmFibGUgICAgICAgID0gU3lzdGVtQ29uZmlndXJhdGlvbi0+RWhjaVBsbENmZ0VuYWJsZTsNCg0KDQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5IcGV0Q29uZmlnICAgICAgICAgICAgICA9IEhwZXRDb25maWc7DQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5QY2llQ29uZmlnICAgICAgICAgICAgICA9IFBjaWVDb25maWc7DQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5Jb0FwaWNDb25maWcgICAgICAgICAgICA9IElvQXBpY0NvbmZpZzsNCg0KICBQY2hQbGF0Zm9ybVBvbGljeVBwaS0+SHBldENvbmZpZy0+RW5hYmxlICAgICAgPSBTeXN0ZW1Db25maWd1cmF0aW9uLT5IcGV0Ow0KICBQY2hQbGF0Zm9ybVBvbGljeVBwaS0+SHBldENvbmZpZy0+QmFzZSAgICAgICAgPSBIUEVUX0JBU0VfQUREUkVTUzsNCiAgUGNoUGxhdGZvcm1Qb2xpY3lQcGktPklvQXBpY0NvbmZpZy0+SW9BcGljSWQgID0gMHgwMTsNCg0KICAvLw0KICAvLyBTZXQgTFBTUyBjb25maWd1cmF0aW9uIGFjY29yZGluZyB0byBzZXR1cCB2YWx1ZS4NCiAgLy8NCiAgUGNoUGxhdGZvcm1Qb2xpY3lQcGktPkxwc3NDb25maWctPkxwc3NQY2lNb2RlRW5hYmxlZCAgID0gU3lzdGVtQ29uZmlndXJhdGlvbi0+THBzc1BjaU1vZGVFbmFibGVkOw0KDQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5McHNzQ29uZmlnLT5EbWExRW5hYmxlZCAgICA9IFN5c3RlbUNvbmZpZ3VyYXRpb24tPkxwc3NEbWExRW5hYmxlZDsNCiAgUGNoUGxhdGZvcm1Qb2xpY3lQcGktPkxwc3NDb25maWctPkkyQzBFbmFibGVkICAgID0gU3lzdGVtQ29uZmlndXJhdGlvbi0+THBzc0kyQzBFbmFibGVkOw0KICBQY2hQbGF0Zm9ybVBvbGljeVBwaS0+THBzc0NvbmZpZy0+STJDMUVuYWJsZWQgICAgPSBTeXN0ZW1Db25maWd1cmF0aW9uLT5McHNzSTJDMUVuYWJsZWQ7DQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5McHNzQ29uZmlnLT5JMkMyRW5hYmxlZCAgICA9IFN5c3RlbUNvbmZpZ3VyYXRpb24tPkxwc3NJMkMyRW5hYmxlZDsNCiAgUGNoUGxhdGZvcm1Qb2xpY3lQcGktPkxwc3NDb25maWctPkkyQzNFbmFibGVkICAgID0gU3lzdGVtQ29uZmlndXJhdGlvbi0+THBzc0kyQzNFbmFibGVkOw0KICBQY2hQbGF0Zm9ybVBvbGljeVBwaS0+THBzc0NvbmZpZy0+STJDNEVuYWJsZWQgICAgPSBTeXN0ZW1Db25maWd1cmF0aW9uLT5McHNzSTJDNEVuYWJsZWQ7DQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5McHNzQ29uZmlnLT5JMkM1RW5hYmxlZCAgICA9IFN5c3RlbUNvbmZpZ3VyYXRpb24tPkxwc3NJMkM1RW5hYmxlZDsNCiAgUGNoUGxhdGZvcm1Qb2xpY3lQcGktPkxwc3NDb25maWctPkkyQzZFbmFibGVkICAgID0gU3lzdGVtQ29uZmlndXJhdGlvbi0+THBzc0kyQzZFbmFibGVkOw0KDQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5McHNzQ29uZmlnLT5EbWEwRW5hYmxlZCAgICA9IFN5c3RlbUNvbmZpZ3VyYXRpb24tPkxwc3NEbWEwRW5hYmxlZDs7DQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5McHNzQ29uZmlnLT5Qd20wRW5hYmxlZCAgICA9IFN5c3RlbUNvbmZpZ3VyYXRpb24tPkxwc3NQd20wRW5hYmxlZDsNCiAgUGNoUGxhdGZvcm1Qb2xpY3lQcGktPkxwc3NDb25maWctPlB3bTFFbmFibGVkICAgID0gU3lzdGVtQ29uZmlndXJhdGlvbi0+THBzc1B3bTFFbmFibGVkOw0KICBQY2hQbGF0Zm9ybVBvbGljeVBwaS0+THBzc0NvbmZpZy0+SHN1YXJ0MEVuYWJsZWQgPSBTeXN0ZW1Db25maWd1cmF0aW9uLT5McHNzSHN1YXJ0MEVuYWJsZWQ7DQogIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5McHNzQ29uZmlnLT5Ic3VhcnQxRW5hYmxlZCA9IFN5c3RlbUNvbmZpZ3VyYXRpb24tPkxwc3NIc3VhcnQxRW5hYmxlZDsNCiAgUGNoUGxhdGZvcm1Qb2xpY3lQcGktPkxwc3NDb25maWctPlNwaUVuYWJsZWQgICAgID0gU3lzdGVtQ29uZmlndXJhdGlvbi0+THBzc1NwaUVuYWJsZWQ7DQoNCg0KICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBQQ0hfUENJRV9NQVhfUk9PVF9QT1JUUzsgSW5kZXgrKykgew0KICAgIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5QY2llQ29uZmlnLT5QY2llU3BlZWRbSW5kZXhdID0gU3lzdGVtQ29uZmlndXJhdGlvbi0+UGNpZVJvb3RQb3J0U3BlZWRbSW5kZXhdOw0KICB9DQoNCiAgU3BpSHNmc1JlZyA9IE1taW9SZWFkMzIgKFNQSV9CQVNFX0FERFJFU1MgKyBSX1BDSF9TUElfSFNGUyk7DQogIGlmICgoU3BpSHNmc1JlZyAmIEJfUENIX1NQSV9IU0ZTX0ZEVikgPT0gQl9QQ0hfU1BJX0hTRlNfRkRWKSB7DQogICAgTW1pb1dyaXRlMzIgKFNQSV9CQVNFX0FERFJFU1MgKyBSX1BDSF9TUElfRkRPQywgVl9QQ0hfU1BJX0ZET0NfRkRTU19GU0RNKTsNCiAgICBTcGlGZG9kUmVnID0gTW1pb1JlYWQzMiAoU1BJX0JBU0VfQUREUkVTUyArIFJfUENIX1NQSV9GRE9EKTsNCiAgICBpZiAoU3BpRmRvZFJlZyA9PSBWX1BDSF9TUElfRkRCQVJfRkxWQUxTSUcpIHsNCiAgICB9DQogIC8vDQogIC8vIERpc2FibGUgY29kZWMgQUxDLTI2Mg0KICAvLw0KICBpZiAoU3lzdGVtQ29uZmlndXJhdGlvbi0+RGlzYWJsZUNvZGVjMjYyID09IDEpIHsNCiAgICAgIElvQmFzZSA9IE1taW9SZWFkMzIgKE1tUGNpQWRkcmVzcyAoMCwNCiAgICAgICAgICAgICAgICAgICAgICAgIFBjaFBsYXRmb3JtUG9saWN5UHBpLT5CdXNOdW1iZXIsDQogICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX05VTUJFUl9QQ0hfTFBDLA0KICAgICAgICAgICAgICAgICAgICAgICAgUENJX0ZVTkNUSU9OX05VTUJFUl9QQ0hfTFBDLA0KICAgICAgICAgICAgICAgICAgICAgICAgMA0KICAgICAgICAgICAgICAgICAgICAgICkgKyBSX1BDSF9MUENfSU9fQkFTRSkgJiBCX1BDSF9MUENfSU9fQkFTRV9CQVI7DQogICAgICBNbWlvQW5kMzIgKChVSU5UTikgKElvQmFzZSArIDB4MjcwKSwgKFVJTlQzMikgKH4weDA3KSk7DQogIH0NCiAgfQ0KDQogIFBjaFBsYXRmb3JtUG9saWN5UHBpRGVzYy0+RmxhZ3MgPSBFRklfUEVJX1BQSV9ERVNDUklQVE9SX1BQSSB8IEVGSV9QRUlfUFBJX0RFU0NSSVBUT1JfVEVSTUlOQVRFX0xJU1Q7DQogIFBjaFBsYXRmb3JtUG9saWN5UHBpRGVzYy0+R3VpZCA9ICZnUGNoUGxhdGZvcm1Qb2xpY3lQcGlHdWlkOw0KICBQY2hQbGF0Zm9ybVBvbGljeVBwaURlc2MtPlBwaSA9IFBjaFBsYXRmb3JtUG9saWN5UHBpOw0KDQogIC8vDQogIC8vIEluc3RhbGwgUENIIFBsYXRmb3JtIFBvbGljeSBQUEkNCiAgLy8NCiAgU3RhdHVzID0gKCoqUGVpU2VydmljZXMpLkluc3RhbGxQcGkgKA0KICAgICAgICAgICAgICBQZWlTZXJ2aWNlcywNCiAgICAgICAgICAgICAgUGNoUGxhdGZvcm1Qb2xpY3lQcGlEZXNjDQogICAgICAgICAgICAgICk7DQogIEFTU0VSVF9FRklfRVJST1IgKFN0YXR1cyk7DQoNCiAgREVCVUcgKChFRklfRF9FUlJPUiwgIlBjaFBvbGljeVNldHVwSW5pdCgpIC0gRW5kXG4iKSk7DQp9DQoNCkVGSV9TVEFUVVMNCkluc3RhbGxQZWlQY2hVc2JQb2xpY3kgKA0KICBJTiBDT05TVCAgRUZJX1BFSV9TRVJWSUNFUyAgKipQZWlTZXJ2aWNlcw0KICApDQp7DQogIEVGSV9TVEFUVVMgICAgICAgICAgICAgIFN0YXR1cyA9IEVGSV9TVUNDRVNTOw0KDQogIEVGSV9QRUlfUFBJX0RFU0NSSVBUT1IgICpQZWlQY2hVc2JQb2xpY3lQcGlEZXNjOw0KICBQQ0hfVVNCX1BPTElDWV9QUEkgICAgICAqUGVpUGNoVXNiUG9saWN5UHBpOw0KICBQQ0hfVVNCX0NPTkZJRyAgICAgICAgICAqVXNiQ29uZmlnOw0KDQogIERFQlVHICgoRUZJX0RfSU5GTywgIkluc3RhbGxQZWlQY2hVc2JQb2xpY3kuLi5cbiIpKTsNCg0KICAvLw0KICAvLyBBbGxvY2F0ZSBkZXNjcmlwdG9yIGFuZCBQUEkgc3RydWN0dXJlcy4gIFNpbmNlIHRoZXNlIGFyZSBkeW5hbWljYWxseSB1cGRhdGVkDQogIC8vIHdlIGNhbm5vdCBkbyBhIGdsb2JhbCB2YXJpYWJsZSBQUEkuDQogIC8vDQogIFN0YXR1cyA9ICgqUGVpU2VydmljZXMpLT5BbGxvY2F0ZVBvb2wgKFBlaVNlcnZpY2VzLCBzaXplb2YgKEVGSV9QRUlfUFBJX0RFU0NSSVBUT1IpLCAodm9pZCAqKikmUGVpUGNoVXNiUG9saWN5UHBpRGVzYyk7DQoNCg0KICBTdGF0dXMgPSAoKlBlaVNlcnZpY2VzKS0+QWxsb2NhdGVQb29sIChQZWlTZXJ2aWNlcywgc2l6ZW9mIChQQ0hfVVNCX1BPTElDWV9QUEkpLCAodm9pZCAqKikmUGVpUGNoVXNiUG9saWN5UHBpKTsNCg0KDQoNCiAgU3RhdHVzID0gKCpQZWlTZXJ2aWNlcyktPkFsbG9jYXRlUG9vbCAoUGVpU2VydmljZXMsIHNpemVvZiAoUENIX1VTQl9DT05GSUcpLCAodm9pZCAqKikmVXNiQ29uZmlnKTsNCg0KDQogIC8vDQogIC8vIEluaXRpYXRlIFBDSCBVU0IgcG9saWN5Lg0KICAvLw0KICBQZWlQY2hVc2JQb2xpY3lQcGktPlJldmlzaW9uID0gUENIX1VTQl9QT0xJQ1lfUFBJX1JFVklTSU9OXzE7DQogIFVzYkNvbmZpZy0+VXNiMjBTZXR0aW5nc1swXS5FbmFibGUgID0gUENIX0RFVklDRV9FTkFCTEU7DQogIFVzYkNvbmZpZy0+VXNiUGVyUG9ydEN0bCAgICAgICAgICAgID0gUENIX0RFVklDRV9ESVNBQkxFOw0KICBVc2JDb25maWctPkVoY2kxVXNiciAgICAgICAgICAgICAgICA9IFBDSF9ERVZJQ0VfRElTQUJMRTsNCg0KICBVc2JDb25maWctPlVzYjIwT3ZlckN1cnJlbnRQaW5zWzBdID0gUGNoVXNiT3ZlckN1cnJlbnRQaW4wOw0KDQogIFVzYkNvbmZpZy0+VXNiMjBPdmVyQ3VycmVudFBpbnNbMV0gPSBQY2hVc2JPdmVyQ3VycmVudFBpbjA7DQoNCiAgVXNiQ29uZmlnLT5Vc2IyME92ZXJDdXJyZW50UGluc1syXSA9IFBjaFVzYk92ZXJDdXJyZW50UGluMTsNCg0KICBVc2JDb25maWctPlVzYjIwT3ZlckN1cnJlbnRQaW5zWzNdID0gUGNoVXNiT3ZlckN1cnJlbnRQaW4xOw0KDQoNCiAgLy8NCiAgLy8gRW5hYmxlIFVTQiBUb3BvbG9neSBjb250cm9sIGFuZCBwcm9ncmFtIHRoZSB0b3BvbG9neSBzZXR0aW5nIGZvciBldmVyeSBVU0IgcG9ydA0KICAvLyBTZWUgUGxhdGZvcm0gRGVzaWduIEd1aWRlIGZvciBkZXNjcmlwdGlvbiBvZiB0b3BvbG9naWVzDQogIC8vDQogICAgLy8NCiAgICAvLyBQb3J0IDA6IH4xMC45IiwgUG9ydCAxOiB+MTAuMSIsIFBvcnQgMjogfjExLjIiLCBQb3J0IDM6IH4xMS41IiwgUG9ydCA0OiB+My43IiwgUG9ydCA1OiB+Mi43IiwgUG9ydCA2OiB+NC4xIg0KICAgIC8vIFBvcnQgNzogfjQuNSIsIFBvcnQgODogfjEwLjciLCBQb3J0IDk6IH4xMC41IiwgUG9ydCAxMDogfjQuMiIsIFBvcnQgMTE6IH40LjMiLCBQb3J0IDEyOiB+My4xIiwgUG9ydCAxMzogfjIuOSINCiAgICAvLw0KDQogICAgLy8NCiAgICAvLyBQb3J0IDA6IH4zLjUiLCBQb3J0IDE6IH40LjEiLCBQb3J0IDI6IH40LjYiLCBQb3J0IDM6IH40LjYiLCBQb3J0IDQ6IH4xMi41IiwgUG9ydCA1OiB+MTIiLCBQb3J0IDY6IH41LjEiDQogICAgLy8gUG9ydCA3OiB+NS4xIiwgUG9ydCA4OiB+NC4xIiwgUG9ydCA5OiB+NC4xIiwgUG9ydCAxMDogfjE0LjUiLCBQb3J0IDExOiB+MTIuOCIsIFBvcnQgMTI6IH4xMi45IiwgUG9ydCAxMzogfjE0LjYiDQogICAgLy8NCiAgVXNiQ29uZmlnLT5Vc2IyMFBvcnRMZW5ndGhbMF0gID0gMHg1MzsNCiAgVXNiQ29uZmlnLT5Vc2IyMFBvcnRMZW5ndGhbMV0gID0gMHg0OTsNCiAgVXNiQ29uZmlnLT5Vc2IyMFBvcnRMZW5ndGhbMl0gID0gMHg0NzsNCiAgVXNiQ29uZmlnLT5Vc2IyMFBvcnRMZW5ndGhbM10gID0gMHg4MDsNCg0KICBQZWlQY2hVc2JQb2xpY3lQcGktPk1vZGUgPSBFSENJX01PREU7DQoNCiAgUGVpUGNoVXNiUG9saWN5UHBpLT5FaGNpTWVtQmFzZUFkZHIgPSBQY2RHZXQzMihQY2RQZWlJY2hFaGNpQ29udHJvbGxlck1lbW9yeUJhc2VBZGRyZXNzKTsNCg0KICBQZWlQY2hVc2JQb2xpY3lQcGktPkVoY2lNZW1MZW5ndGggICA9IChVSU5UMzIpIDB4NDAwICogUGNoRWhjaUNvbnRyb2xsZXJNYXg7DQoNCiAgUGVpUGNoVXNiUG9saWN5UHBpLT5YaGNpTWVtQmFzZUFkZHIgPSAwOw0KDQogIFBlaVBjaFVzYlBvbGljeVBwaS0+VXNiQ29uZmlnICAgICAgID0gVXNiQ29uZmlnOw0KDQogIFBlaVBjaFVzYlBvbGljeVBwaURlc2MtPkZsYWdzICAgICAgID0gRUZJX1BFSV9QUElfREVTQ1JJUFRPUl9QUEkgfCBFRklfUEVJX1BQSV9ERVNDUklQVE9SX1RFUk1JTkFURV9MSVNUOw0KDQogIFBlaVBjaFVzYlBvbGljeVBwaURlc2MtPkd1aWQgICAgICAgID0gJmdQY2hVc2JQb2xpY3lQcGlHdWlkOw0KDQogIFBlaVBjaFVzYlBvbGljeVBwaURlc2MtPlBwaSAgICAgICAgID0gUGVpUGNoVXNiUG9saWN5UHBpOw0KDQogIC8vDQogIC8vIEluc3RhbGwgUENIIFVTQiBQb2xpY3kgUFBJDQogIC8vDQogIFN0YXR1cyA9ICgqKlBlaVNlcnZpY2VzKS5JbnN0YWxsUHBpIChQZWlTZXJ2aWNlcywgUGVpUGNoVXNiUG9saWN5UHBpRGVzYyk7DQoNCiAgcmV0dXJuIFN0YXR1czsNCn0NCg==