Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBUYWcgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucwovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gSGVydukgRHJvbG9uIDxkcm9sb25AaW5mb25pZS5mcj4KLy8KLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKLy8KLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCi8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCi8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQovLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAovLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCi8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCi8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgovLyBUSElTIERJU0NMQUlNRVIuCi8vCi8vIFVzZSBhdCB5b3VyIG93biByaXNrIQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZuZGVmIEZSRUVJTUFHRVRBR19ICiNkZWZpbmUgRlJFRUlNQUdFVEFHX0gKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gRXhpZiBKUEVHIHRhZ3MKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBUSUZGIFJldi4gNi4wIEF0dHJpYnV0ZSBJbmZvcm1hdGlvbiBVc2VkIGluIEV4aWYKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gVGFncyByZWxhdGluZyB0byBpbWFnZSBkYXRhIHN0cnVjdHVyZQoKI2RlZmluZSBUQUdfSU1BR0VfV0lEVEgJCQkJCTB4MDEwMAojZGVmaW5lIFRBR19JTUFHRV9IRUlHSFQJCQkJMHgwMTAxCiNkZWZpbmUgVEFHX0JJVFNfUEVSX1NBTVBMRQkJCQkweDAxMDIKI2RlZmluZSBUQUdfQ09NUFJFU1NJT04JCQkJCTB4MDEwMwojZGVmaW5lIFRBR19QSE9UT01FVFJJQ19JTlRFUlBSRVRBVElPTgkweDAxMDYKI2RlZmluZSBUQUdfT1JJRU5UQVRJT04JCQkJCTB4MDExMgojZGVmaW5lIFRBR19TQU1QTEVTX1BFUl9QSVhFTAkJCTB4MDExNQojZGVmaW5lIFRBR19QTEFOQVJfQ09ORklHVVJBVElPTgkJMHgwMTFDCiNkZWZpbmUgVEFHX1lDQkNSX1NVQlNBTVBMSU5HCQkJMHgwMjEyCiNkZWZpbmUgVEFHX1lDQkNSX1BPU0lUSU9OSU5HCQkJMHgwMjEzCiNkZWZpbmUgVEFHX1hfUkVTT0xVVElPTgkJCQkweDAxMUEKI2RlZmluZSBUQUdfWV9SRVNPTFVUSU9OCQkJCTB4MDExQgojZGVmaW5lIFRBR19SRVNPTFVUSU9OX1VOSVQJCQkJMHgwMTI4CgovLyBMaWJUSUYgY29tcHJlc3Npb24gbW9kZXMKCiNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9OT05FCQkxCS8qIGR1bXAgbW9kZSAqLwojZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fQ0NJVFRSTEUJMgkvKiBDQ0lUVCBtb2RpZmllZCBIdWZmbWFuIFJMRSAqLwojZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fQ0NJVFRGQVgzCTMJLyogQ0NJVFQgR3JvdXAgMyBmYXggZW5jb2RpbmcgKi8KI2RlZmluZSAgICAgVEFHX0NPTVBSRVNTSU9OX0NDSVRUX1Q0ICAgICAgICAzICAgICAgIC8qIENDSVRUIFQuNCAoVElGRiA2IG5hbWUpICovCiNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9DQ0lUVEZBWDQJNAkvKiBDQ0lUVCBHcm91cCA0IGZheCBlbmNvZGluZyAqLwojZGVmaW5lICAgICBUQUdfQ09NUFJFU1NJT05fQ0NJVFRfVDYgICAgICAgIDQgICAgICAgLyogQ0NJVFQgVC42IChUSUZGIDYgbmFtZSkgKi8KI2RlZmluZQkgICAgVEFHX0NPTVBSRVNTSU9OX0xaVwkJNSAgICAgICAvKiBMZW1wZWwtWml2ICAmIFdlbGNoICovCiNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9PSlBFRwkJNgkvKiAhNi4wIEpQRUcgKi8KI2RlZmluZQkgICAgVEFHX0NPTVBSRVNTSU9OX0pQRUcJCTcJLyogJUpQRUcgRENUIGNvbXByZXNzaW9uICovCiNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9ORVhUCQkzMjc2NgkvKiBOZVhUIDItYml0IFJMRSAqLwojZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fQ0NJVFRSTEVXCTMyNzcxCS8qICMxIHcvIHdvcmQgYWxpZ25tZW50ICovCiNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9QQUNLQklUUwkzMjc3MwkvKiBNYWNpbnRvc2ggUkxFICovCiNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9USFVOREVSU0NBTgkzMjgwOQkvKiBUaHVuZGVyU2NhbiBSTEUgKi8KLyogY29kZXMgMzI4OTUtMzI4OTggYXJlIHJlc2VydmVkIGZvciBBTlNJIElUOCBUSUZGL0lUIDxka2VsbHlAYXBhZ28uY29tKSAqLwojZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fSVQ4Q1RQQUQJMzI4OTUgICAvKiBJVDggQ1Qgdy9wYWRkaW5nICovCiNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9JVDhMVwkJMzI4OTYgICAvKiBJVDggTGluZXdvcmsgUkxFICovCiNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9JVDhNUAkJMzI4OTcgICAvKiBJVDggTW9ub2Nocm9tZSBwaWN0dXJlICovCiNkZWZpbmUJICAgIFRBR19DT01QUkVTU0lPTl9JVDhCTAkJMzI4OTggICAvKiBJVDggQmluYXJ5IGxpbmUgYXJ0ICovCi8qIGNvbXByZXNzaW9uIGNvZGVzIDMyOTA4LTMyOTExIGFyZSByZXNlcnZlZCBmb3IgUGl4YXIgKi8KI2RlZmluZSAgICAgVEFHX0NPTVBSRVNTSU9OX1BJWEFSRklMTQkzMjkwOCAgIC8qIFBpeGFyIGNvbXBhbmRlZCAxMGJpdCBMWlcgKi8KI2RlZmluZQkgICAgVEFHX0NPTVBSRVNTSU9OX1BJWEFSTE9HCTMyOTA5ICAgLyogUGl4YXIgY29tcGFuZGVkIDExYml0IFpJUCAqLwojZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fREVGTEFURQkJMzI5NDYJLyogRGVmbGF0ZSBjb21wcmVzc2lvbiAqLwojZGVmaW5lICAgICBUQUdfQ09NUFJFU1NJT05fQURPQkVfREVGTEFURSAgIDggICAgICAgLyogRGVmbGF0ZSBjb21wcmVzc2lvbiwKCQkJCQkJICAgYXMgcmVjb2duaXplZCBieSBBZG9iZSAqLwovKiBjb21wcmVzc2lvbiBjb2RlIDMyOTQ3IGlzIHJlc2VydmVkIGZvciBPY2VhbmEgTWF0cml4IDxkZXZAb2NlYW5hLmNvbT4gKi8KI2RlZmluZSAgICAgVEFHX0NPTVBSRVNTSU9OX0RDUyAgICAgICAgICAgICAzMjk0NyAgIC8qIEtvZGFrIERDUyBlbmNvZGluZyAqLwojZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fSkJJRwkJMzQ2NjEJLyogSVNPIEpCSUcgKi8KI2RlZmluZSAgICAgVEFHX0NPTVBSRVNTSU9OX1NHSUxPRwkJMzQ2NzYJLyogU0dJIExvZyBMdW1pbmFuY2UgUkxFICovCiNkZWZpbmUgICAgIFRBR19DT01QUkVTU0lPTl9TR0lMT0cyNAkzNDY3NwkvKiBTR0kgTG9nIDI0LWJpdCBwYWNrZWQgKi8KI2RlZmluZSAgICAgVEFHX0NPTVBSRVNTSU9OX0pQMjAwMCAgICAgICAgICAzNDcxMiAgIC8qIExlYWR0b29scyBKUEVHMjAwMCAqLwojZGVmaW5lCSAgICBUQUdfQ09NUFJFU1NJT05fTFpNQQkJMzQ5MjUJLyogTFpNQTIgKi8KCi8vIFRhZ3MgcmVsYXRpbmcgdG8gcmVjb3JkaW5nIG9mZnNldAoKI2RlZmluZSBUQUdfU1RSSVBfT0ZGU0VUUwkJCQkJMHgwMTExCiNkZWZpbmUgVEFHX1JPV1NfUEVSX1NUUklQCQkJCQkweDAxMTYKI2RlZmluZSBUQUdfU1RSSVBfQllURV9DT1VOVFMJCQkJMHgwMTE3CiNkZWZpbmUgVEFHX0pQRUdfSU5URVJDSEFOR0VfRk9STUFUCQkJMHgwMjAxCiNkZWZpbmUgVEFHX0pQRUdfSU5URVJDSEFOR0VfRk9STUFUX0xFTkdUSAkweDAyMDIKCi8vIFRhZ3MgcmVsYXRpbmcgdG8gaW1hZ2UgZGF0YSBjaGFyYWN0ZXJpc3RpY3MKCiNkZWZpbmUgVEFHX1RSQU5TRkVSX0ZVTkNUSU9OCQkweDAxMkQKI2RlZmluZSBUQUdfV0hJVEVfUE9JTlQJCQkJMHgwMTNFCiNkZWZpbmUgVEFHX1BSSU1BUllfQ0hST01BVElDSVRJRVMJMHgwMTNGCiNkZWZpbmUgVEFHX1lDQkNSX0NPRUZGSUNJRU5UUwkJMHgwMjExCiNkZWZpbmUgVEFHX1JFRkVSRU5DRV9CTEFDS19XSElURQkweDAyMTQKCi8vIE90aGVyIHRhZ3MKCiNkZWZpbmUgVEFHX0RBVEVUSU1FIAkJCQkweDAxMzIKI2RlZmluZSBUQUdfSU1BR0VfREVTQ1JJUFRJT04gCQkweDAxMEUKI2RlZmluZSBUQUdfTUFLRSAJCQkJCTB4MDEwRgojZGVmaW5lIFRBR19NT0RFTCAJCQkJCTB4MDExMAojZGVmaW5lIFRBR19TT0ZUV0FSRSAJCQkJMHgwMTMxCiNkZWZpbmUgVEFHX0FSVElTVCAJCQkJCTB4MDEzQgojZGVmaW5lIFRBR19DT1BZUklHSFQgCQkJCTB4ODI5OAoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBFeGlmIElGRCBBdHRyaWJ1dGUgSW5mb3JtYXRpb24KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gVGFncyByZWxhdGluZyB0byB2ZXJzaW9uCgojZGVmaW5lIFRBR19FWElGX1ZFUlNJT04gCQkJMHg5MDAwCiNkZWZpbmUgVEFHX0ZMQVNIUElYX1ZFUlNJT04gCQkweEEwMDAKCi8vIFRhZyByZWxhdGluZyB0byBpbWFnZSBkYXRhIGNoYXJhY3RlcmlzdGljcwoKI2RlZmluZSBUQUdfQ09MT1JfU1BBQ0UgCQkJMHhBMDAxCgovLyBUYWdzIHJlbGF0aW5nIHRvIGltYWdlIGNvbmZpZ3VyYXRpb24KCiNkZWZpbmUgVEFHX0NPTVBPTkVOVFNfQ09ORklHVVJBVElPTgkweDkxMDEKI2RlZmluZSBUQUdfQ09NUFJFU1NFRF9CSVRTX1BFUl9QSVhFTAkweDkxMDIKI2RlZmluZSBUQUdfUElYRUxfWF9ESU1FTlNJT04JCQkweEEwMDIKI2RlZmluZSBUQUdfUElYRUxfWV9ESU1FTlNJT04JCQkweEEwMDMKCi8vIFRhZ3MgcmVsYXRpbmcgdG8gdXNlciBpbmZvcm1hdGlvbgoKI2RlZmluZSBUQUdfTUFSS0VSX05PVEUJCTB4OTI3QwojZGVmaW5lIFRBR19VU0VSX0NPTU1FTlQJMHg5Mjg2CiAgICAKLy8gVGFnIHJlbGF0aW5nIHRvIHJlbGF0ZWQgZmlsZSBpbmZvcm1hdGlvbgoKI2RlZmluZSBUQUdfUkVMQVRFRF9TT1VORF9GSUxFCQkJMHhBMDA0CgovLyBUYWdzIHJlbGF0aW5nIHRvIGRhdGUgYW5kIHRpbWUKCiNkZWZpbmUgVEFHX0RBVEVUSU1FX09SSUdJTkFMCQkJMHg5MDAzCiNkZWZpbmUgVEFHX0RBVEVUSU1FX0RJR0lUSVpFRAkJCTB4OTAwNAojZGVmaW5lIFRBR19TVUJTRUNPTkRfVElNRQkJCQkweDkyOTAKI2RlZmluZSBUQUdfU1VCU0VDT05EX1RJTUVfT1JJR0lOQUwJCTB4OTI5MQojZGVmaW5lIFRBR19TVUJTRUNPTkRfVElNRV9ESUdJVElaRUQJMHg5MjkyCgovLyBUYWdzIHJlbGF0aW5nIHRvIHBpY3R1cmUtdGFraW5nIGNvbmRpdGlvbnMKCiNkZWZpbmUgVEFHX0VYUE9TVVJFX1RJTUUJCQkJMHg4MjlBCiNkZWZpbmUgVEFHX0ZOVU1CRVIJCQkJCQkweDgyOUQKI2RlZmluZSBUQUdfRVhQT1NVUkVfUFJPR1JBTQkJCTB4ODgyMgojZGVmaW5lIFRBR19TUEVDVFJBTF9TRU5TSVRJVklUWQkJMHg4ODI0CiNkZWZpbmUgVEFHX0lTT19TUEVFRF9SQVRJTkdTIAkJCTB4ODgyNwojZGVmaW5lIFRBR19PRUNGCQkJCQkJMHg4ODI4CiNkZWZpbmUgVEFHX1NIVVRURVJfU1BFRURfVkFMVUUgCQkweDkyMDEKI2RlZmluZSBUQUdfQVBFUlRVUkVfVkFMVUUgCQkJCTB4OTIwMgojZGVmaW5lIFRBR19CUklHSFRORVNTX1ZBTFVFCQkJMHg5MjAzCiNkZWZpbmUgVEFHX0VYUE9TVVJFX0JJQVNfVkFMVUUgCQkweDkyMDQKI2RlZmluZSBUQUdfTUFYX0FQRVJUVVJFX1ZBTFVFIAkJCTB4OTIwNQojZGVmaW5lIFRBR19TVUJKRUNUX0RJU1RBTkNFCQkJMHg5MjA2CiNkZWZpbmUgVEFHX01FVEVSSU5HX01PREUJCQkJMHg5MjA3CiNkZWZpbmUgVEFHX0xJR0hUX1NPVVJDRQkJCQkweDkyMDgKI2RlZmluZSBUQUdfRkxBU0gJCQkJCQkweDkyMDkKI2RlZmluZSBUQUdfRk9DQUxfTEVOR1RICQkJCTB4OTIwQQojZGVmaW5lIFRBR19TVUJKRUNUX0FSRUEJCQkJMHg5MjE0CiNkZWZpbmUgVEFHX0ZMQVNIX0VORVJHWQkJCQkweEEyMEIKI2RlZmluZSBUQUdfU1BBVElBTF9GUkVRX1JFU1BPTlNFIAkJMHhBMjBDCiNkZWZpbmUgVEFHX0ZPQ0FMX1BMQU5FX1hfUkVTCQkJMHhBMjBFCiNkZWZpbmUgVEFHX0ZPQ0FMX1BMQU5FX1lfUkVTCQkJMHhBMjBGCiNkZWZpbmUgVEFHX0ZPQ0FMX1BMQU5FX1VOSVQJCQkweEEyMTAKI2RlZmluZSBUQUdfU1VCSkVDVF9MT0NBVElPTiAJCQkweEEyMTQKI2RlZmluZSBUQUdfRVhQT1NVUkVfSU5ERVgJCQkJMHhBMjE1CiNkZWZpbmUgVEFHX1NFTlNJTkdfTUVUSE9ECQkJCTB4QTIxNwojZGVmaW5lIFRBR19GSUxFX1NPVVJDRQkJCQkJMHhBMzAwCiNkZWZpbmUgVEFHX1NDRU5FX1RZUEUJCQkJCTB4QTMwMQojZGVmaW5lIFRBR19DRkFfUEFUVEVSTgkJCQkJMHhBMzAyCiNkZWZpbmUgVEFHX0NVU1RPTV9SRU5ERVJFRAkJCQkweEE0MDEKI2RlZmluZSBUQUdfRVhQT1NVUkVfTU9ERQkJCQkweEE0MDIKI2RlZmluZSBUQUdfV0hJVEVfQkFMQU5DRQkJCQkweEE0MDMKI2RlZmluZSBUQUdfRElHSVRBTF9aT09NX1JBVElPCQkJMHhBNDA0CiNkZWZpbmUgVEFHX0ZPQ0FMX0xFTkdUSF9JTl8zNU1NX0ZJTE0JMHhBNDA1CiNkZWZpbmUgVEFHX1NDRU5FX0NBUFRVUkVfVFlQRQkJCTB4QTQwNgojZGVmaW5lIFRBR19HQUlOX0NPTlRST0wJCQkJMHhBNDA3CiNkZWZpbmUgVEFHX0NPTlRSQVNUCQkJCQkweEE0MDgKI2RlZmluZSBUQUdfU0FUVVJBVElPTgkJCQkJMHhBNDA5CiNkZWZpbmUgVEFHX1NIQVJQTkVTUwkJCQkJMHhBNDBBCiNkZWZpbmUgVEFHX0RFVklDRV9TRVRUSU5HX0RFU0NSSVBUSU9OCTB4QTQwQgojZGVmaW5lIFRBR19TVUJKRUNUX0RJU1RBTkNFX1JBTkdFCQkweEE0MEMKCi8vIE90aGVyIHRhZ3MKCiNkZWZpbmUgVEFHX0lNQUdFX1VOSVFVRV9JRAkJCQkweEE0MjAKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gR1BTIEF0dHJpYnV0ZSBJbmZvcm1hdGlvbgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojZGVmaW5lIFRBR19HUFNfVkVSU0lPTl9JRAkJCQkweDAwMDAKI2RlZmluZSBUQUdfR1BTX0xBVElUVURFX1JFRgkJCTB4MDAwMQojZGVmaW5lIFRBR19HUFNfTEFUSVRVREUJCQkJMHgwMDAyCiNkZWZpbmUgVEFHX0dQU19MT05HSVRVREVfUkVGCQkJMHgwMDAzCiNkZWZpbmUgVEFHX0dQU19MT05HSVRVREUJCQkJMHgwMDA0CiNkZWZpbmUgVEFHX0dQU19BTFRJVFVERV9SRUYJCQkweDAwMDUKI2RlZmluZSBUQUdfR1BTX0FMVElUVURFCQkJCTB4MDAwNgojZGVmaW5lIFRBR19HUFNfVElNRV9TVEFNUAkJCQkweDAwMDcKI2RlZmluZSBUQUdfR1BTX1NBVEVMTElURVMJCQkJMHgwMDA4CiNkZWZpbmUgVEFHX0dQU19TVEFUVVMJCQkJCTB4MDAwOQojZGVmaW5lIFRBR19HUFNfTUVBU1VSRV9NT0RFCQkJMHgwMDBBCiNkZWZpbmUgVEFHX0dQU19ET1AJCQkJCQkweDAwMEIKI2RlZmluZSBUQUdfR1BTX1NQRUVEX1JFRgkJCQkweDAwMEMKI2RlZmluZSBUQUdfR1BTX1NQRUVECQkJCQkweDAwMEQKI2RlZmluZSBUQUdfR1BTX1RSQUNLX1JFRgkJCQkweDAwMEUKI2RlZmluZSBUQUdfR1BTX1RSQUNLCQkJCQkweDAwMEYKI2RlZmluZSBUQUdfR1BTX0lNR19ESVJFQ1RJT05fUkVGCQkweDAwMTAKI2RlZmluZSBUQUdfR1BTX0lNR19ESVJFQ1RJT04JCQkweDAwMTEKI2RlZmluZSBUQUdfR1BTX01BUF9EQVRVTQkJCQkweDAwMTIKI2RlZmluZSBUQUdfR1BTX0RFU1RfTEFUSVRVREVfUkVGCQkweDAwMTMKI2RlZmluZSBUQUdfR1BTX0RFU1RfTEFUSVRVREUJCQkweDAwMTQKI2RlZmluZSBUQUdfR1BTX0RFU1RfTE9OR0lUVURFX1JFRgkJMHgwMDE1CiNkZWZpbmUgVEFHX0dQU19ERVNUX0xPTkdJVFVERQkJCTB4MDAxNgojZGVmaW5lIFRBR19HUFNfREVTVF9CRUFSSU5HX1JFRgkJMHgwMDE3CiNkZWZpbmUgVEFHX0dQU19ERVNUX0JFQVJJTkcJCQkweDAwMTgKI2RlZmluZSBUQUdfR1BTX0RFU1RfRElTVEFOQ0VfUkVGCQkweDAwMTkKI2RlZmluZSBUQUdfR1BTX0RFU1RfRElTVEFOQ0UJCQkweDAwMUEKI2RlZmluZSBUQUdfR1BTX1BST0NFU1NJTkdfTUVUSE9ECQkweDAwMUIKI2RlZmluZSBUQUdfR1BTX0FSRUFfSU5GT1JNQVRJT04JCTB4MDAxQwojZGVmaW5lIFRBR19HUFNfREFURV9TVEFNUAkJCQkweDAwMUQKI2RlZmluZSBUQUdfR1BTX0RJRkZFUkVOVElBTAkJCTB4MDAxRQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBJUFRDL05BQSB0YWdzCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNkZWZpbmUgVEFHX1JFQ09SRF9WRVJTSU9OCQkJCQkweDAyMDAKI2RlZmluZSBUQUdfQ0FQVElPTgkJCQkJCQkweDAyNzgKI2RlZmluZSBUQUdfV1JJVEVSCQkJCQkJCTB4MDI3QQojZGVmaW5lIFRBR19IRUFETElORQkJCQkJCTB4MDI2OQojZGVmaW5lIFRBR19TUEVDSUFMX0lOU1RSVUNUSU9OUwkJCTB4MDIyOAojZGVmaW5lIFRBR19CWV9MSU5FCQkJCQkJCTB4MDI1MAojZGVmaW5lIFRBR19CWV9MSU5FX1RJVExFCQkJCQkweDAyNTUKI2RlZmluZSBUQUdfQ1JFRElUCQkJCQkJCTB4MDI2RQojZGVmaW5lIFRBR19TT1VSQ0UJCQkJCQkJMHgwMjczCiNkZWZpbmUgVEFHX09CSkVDVF9OQU1FCQkJCQkJMHgwMjA1CiNkZWZpbmUgVEFHX0RBVEVfQ1JFQVRFRAkJCQkJMHgwMjM3CiNkZWZpbmUgVEFHX0NJVFkJCQkJCQkJMHgwMjVBCiNkZWZpbmUgVEFHX1BST1ZJTkNFX09SX1NUQVRFCQkJCTB4MDI1RgojZGVmaW5lIFRBR19DT1VOVFJZX09SX1BSSU1BUllfTE9DQVRJT04JCTB4MDI2NQojZGVmaW5lIFRBR19PUklHSU5BTF9UUkFOU01JU1NJT05fUkVGRVJFTkNFIDB4MDI2NwojZGVmaW5lIFRBR19DQVRFR09SWQkJCQkJCTB4MDIwRgojZGVmaW5lIFRBR19TVVBQTEVNRU5UQUxfQ0FURUdPUklFUwkJCTB4MDIxNAojZGVmaW5lIFRBR19VUkdFTkNZCQkJCQkJCTB4MDIwQQojZGVmaW5lIFRBR19LRVlXT1JEUwkJCQkJCTB4MDIxOQojZGVmaW5lIFRBR19DT1BZUklHSFRfTk9USUNFCQkJCTB4MDI3NAojZGVmaW5lIFRBR19SRUxFQVNFX0RBVEUJCQkJCTB4MDIxRQojZGVmaW5lIFRBR19SRUxFQVNFX1RJTUUJCQkJCTB4MDIyMwojZGVmaW5lIFRBR19USU1FX0NSRUFURUQJCQkJCTB4MDIzQwojZGVmaW5lIFRBR19PUklHSU5BVElOR19QUk9HUkFNCQkJCTB4MDI0MQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBHZW9USUZGIHRhZ3MKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy8gdGFncyAzMzU1MCBpcyBhIHByaXZhdGUgdGFnIHJlZ2lzdGVyZWQgdG8gU29mdERlc2ssIEluYwojZGVmaW5lIFRJRkZUQUdfR0VPUElYRUxTQ0FMRQkJMzM1NTAKLy8gdGFncyAzMzkyMC0zMzkyMSBhcmUgcHJpdmF0ZSB0YWdzIHJlZ2lzdGVyZWQgdG8gSW50ZXJncmFwaCwgSW5jCiNkZWZpbmUgVElGRlRBR19JTlRFUkdSQVBIX01BVFJJWAkzMzkyMAojZGVmaW5lIFRJRkZUQUdfR0VPVElFUE9JTlRTCQkzMzkyMgovLyB0YWdzIDM0MjYzLTM0MjY0IGFyZSBwcml2YXRlIHRhZ3MgcmVnaXN0ZXJlZCB0byBOQVNBLUpQTCBDYXJ0byBHcm91cAojZGVmaW5lIFRJRkZUQUdfSlBMX0NBUlRPX0lGRAkJMzQyNjMKI2RlZmluZSBUSUZGVEFHX0dFT1RSQU5TTUFUUklYCQkzNDI2NCAgICAvKiBOZXcgTWF0cml4IFRhZyByZXBsYWNlcyAzMzkyMCAqLwovLyB0YWdzIDM0NzM1LTM0MzggYXJlIHByaXZhdGUgdGFncyByZWdpc3RlcmVkIHRvIFNQT1QgSW1hZ2UsIEluYwojZGVmaW5lIFRJRkZUQUdfR0VPS0VZRElSRUNUT1JZCQkzNDczNQojZGVmaW5lIFRJRkZUQUdfR0VPRE9VQkxFUEFSQU1TCQkzNDczNgojZGVmaW5lIFRJRkZUQUdfR0VPQVNDSUlQQVJBTVMJCTM0NzM3CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIEZyZWVJbWFnZSBBbmltYXRpb24gdGFncwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojZGVmaW5lIEFOSU1UQUdfTE9HSUNBTFdJRFRICTB4MDAwMQojZGVmaW5lIEFOSU1UQUdfTE9HSUNBTEhFSUdIVAkweDAwMDIKI2RlZmluZSBBTklNVEFHX0dMT0JBTFBBTEVUVEUJMHgwMDAzCiNkZWZpbmUgQU5JTVRBR19MT09QCQkJMHgwMDA0CiNkZWZpbmUgQU5JTVRBR19GUkFNRUxFRlQJCTB4MTAwMQojZGVmaW5lIEFOSU1UQUdfRlJBTUVUT1AJCTB4MTAwMgojZGVmaW5lIEFOSU1UQUdfTk9MT0NBTFBBTEVUVEUJMHgxMDAzCiNkZWZpbmUgQU5JTVRBR19JTlRFUkxBQ0VECQkweDEwMDQKI2RlZmluZSBBTklNVEFHX0ZSQU1FVElNRQkJMHgxMDA1CiNkZWZpbmUgQU5JTVRBR19ESVNQT1NBTE1FVEhPRAkweDEwMDYKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEhlbHBlciBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIHRoZSBGSVRBRyBzdHJ1Y3R1cmUKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qKgpEZXNjcmliZXMgdGhlIHRhZyBmb3JtYXQgZGVzY3JpcHRvcgpHaXZlbiBhIEZSRUVfSU1BR0VfTURUWVBFLCBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhpcyB0eXBlIGluIGJ5dGVzIHVuaXQKQHBhcmFtIHR5cGUgVGFnIGRhdGEgdHlwZQpAcmV0dXJuIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGRhdGEgdHlwZSwgaW4gYnl0ZXMKQHNlZSBGUkVFX0lNQUdFX01EVFlQRQoqLwp1bnNpZ25lZCBGcmVlSW1hZ2VfVGFnRGF0YVdpZHRoKEZSRUVfSU1BR0VfTURUWVBFIHR5cGUpOwoKLyoqCkNhbGN1bGF0ZSB0aGUgbWVtb3J5IHNpemUgcmVxdWlyZWQgYnkgYSB0YWcsIGluY2x1ZGluZyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCkBwYXJhbSB0YWcgVGhlIHRhZyB0byBleGFtaW5lCkByZXR1cm4gUmV0dW5zIHRoZSBtZW1vcnkgc2l6ZSB1c2VkIGJ5IGEgdGFnCiovCnNpemVfdCBGcmVlSW1hZ2VfR2V0VGFnTWVtb3J5U2l6ZShGSVRBRyAqdGFnKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKioKCVN0cnVjdHVyZSB0byBob2xkIGEgdGFnIGluZm9ybWF0aW9uCiovCnR5cGVkZWYgc3RydWN0IHRhZ1RhZ0luZm8gewoJV09SRCB0YWc7CQkJLy8gVGFnIElEIChyZXF1aXJlZCkKCWNoYXIgKmZpZWxkbmFtZTsJLy8gRmllbGQgbmFtZSAocmVxdWlyZWQpCgljaGFyICpkZXNjcmlwdGlvbjsJLy8gRmllbGQgZGVzY3JpcHRpb24gKG1heSBiZSBOVUxMKQp9IFRhZ0luZm87CgoKLyoqCkNsYXNzIHRvIGhvbGQgdGFnIGluZm9ybWF0aW9uIChiYXNlZCBvbiBNZXllcnOSIFNpbmdsZXRvbikuPGJyPgoKU2FtcGxlIHVzYWdlIDo8YnI+Cjxjb2RlPgpUYWdMaWImIHMgPSBUYWdMaWI6Omluc3RhbmNlKCk7ClRhZ0luZm8gKnRhZ19pbmZvID0gcy5nZXRUYWdJbmZvKEVYSUZfTUFJTiwgMHgwMTAwKTsKPC9jb2RlPgoKTm90ZSBvbiBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMgOiAKClRoZSBzaW5nbGV0b24gcGF0dGVybiBtdXN0IGJlIGNhcmVmdWxseSBjb25zdHJ1Y3RlZCBpbiBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuIApJZiB0d28gdGhyZWFkcyBhcmUgdG8gZXhlY3V0ZSB0aGUgY3JlYXRpb24gbWV0aG9kIGF0IHRoZSBzYW1lIHRpbWUgd2hlbiBhIHNpbmdsZXRvbiAKZG9lcyBub3QgeWV0IGV4aXN0LCB0aGV5IGJvdGggbXVzdCBjaGVjayBmb3IgYW4gaW5zdGFuY2Ugb2YgdGhlIHNpbmdsZXRvbiBhbmQgdGhlbiAKb25seSBvbmUgc2hvdWxkIGNyZWF0ZSB0aGUgbmV3IG9uZS4KVGhlIGNsYXNzaWMgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtIGlzIHRvIHVzZSBtdXR1YWwgZXhjbHVzaW9uIG9uIHRoZSBjbGFzcyB0aGF0IAppbmRpY2F0ZXMgdGhhdCB0aGUgb2JqZWN0IGlzIGJlaW5nIGluc3RhbnRpYXRlZC4KVGhlIEZyZWVJbWFnZSBzb2x1dGlvbiBpcyB0byBpbnN0YW50aWF0ZSB0aGUgc2luZ2xldG9uIGJlZm9yZSBhbnkgb3RoZXIgdGhyZWFkIGlzIGxhdW5jaGVkLCAKaS5lLiBpbnNpZGUgdGhlIEZyZWVJbWFnZV9Jbml0aWFsaXNlIGZ1bmN0aW9uIChzZWUgUGx1Z2luLmNwcCkuIAoqLwoKY2xhc3MgVGFnTGliIHsKcHVibGljOgoKCS8qKgoJaW50ZXJuYWwgdGFnIGluZm8gdGFibGVzIHJlZ2lzdGVyZWQgaW4gVGFnTGliCgkqLwoJZW51bSBNRE1PREVMIHsKCQlVTktOT1dOLAoJCUVYSUZfTUFJTiwgCgkJRVhJRl9FWElGLCAKCQlFWElGX0dQUywgCgkJRVhJRl9JTlRFUk9QLAoJCUVYSUZfTUFLRVJOT1RFX0NBTk9OLAoJCUVYSUZfTUFLRVJOT1RFX0NBU0lPVFlQRTEsCgkJRVhJRl9NQUtFUk5PVEVfQ0FTSU9UWVBFMiwKCQlFWElGX01BS0VSTk9URV9GVUpJRklMTSwKCQlFWElGX01BS0VSTk9URV9LWU9DRVJBLAoJCUVYSUZfTUFLRVJOT1RFX01JTk9MVEEsCgkJRVhJRl9NQUtFUk5PVEVfTklLT05UWVBFMSwKCQlFWElGX01BS0VSTk9URV9OSUtPTlRZUEUyLAoJCUVYSUZfTUFLRVJOT1RFX05JS09OVFlQRTMsCgkJRVhJRl9NQUtFUk5PVEVfT0xZTVBVU1RZUEUxLAoJCUVYSUZfTUFLRVJOT1RFX1BBTkFTT05JQywKCQlFWElGX01BS0VSTk9URV9BU0FISSwKCQlFWElGX01BS0VSTk9URV9QRU5UQVgsCgkJRVhJRl9NQUtFUk5PVEVfU09OWSwKCQlFWElGX01BS0VSTk9URV9TSUdNQV9TRDEsCgkJRVhJRl9NQUtFUk5PVEVfU0lHTUFfRk9WRU9OLAoJCUlQVEMsCgkJR0VPVElGRiwKCQlBTklNQVRJT04KCX07Cgpwcml2YXRlOgoKCXR5cGVkZWYgc3RkOjptYXA8V09SRCwgVGFnSW5mbyo+IFRBR0lORk87Cgl0eXBlZGVmIHN0ZDo6bWFwPGludCwgVEFHSU5GTyo+ICBUQUJMRU1BUDsKCgkvLy8gc3RvcmUgaGFzaCB0YWJsZXMgZm9yIGFsbCBrbm93biB0YWcgaW5mbyB0YWJsZXMKCVRBQkxFTUFQIF90YWJsZV9tYXA7Cgpwcml2YXRlOgoJLyoqCglDb25zdHJ1Y3RvciAocHJpdmF0ZSk8YnI+CglUaGlzIGlzIHdoZXJlIHRoZSB0YWcgaW5mbyB0YWJsZXMgYXJlIGluaXRpYWxpemVkLgoJQHNlZSBhZGRNZXRhZGF0YU1vZGVsCgkqLwoJVGFnTGliKCk7CgoJLy8vIEFzc2lnbmVtZW50IG9wZXJhdG9yIChkaXNhYmxlZCkKCXZvaWQgb3BlcmF0b3I9KFRhZ0xpYiYpOwoKCS8vLyBDb3B5IGNvbnN0cnVjdG9yIChkaXNhYmxlZCkKCVRhZ0xpYihjb25zdCBUYWdMaWImKTsKCQoJLyoqIAoJVXNlZCBpbiB0aGUgY29uc3RydWN0b3IgdG8gaW5pdGlhbGl6ZSB0aGUgdGFnIHRhYmxlcwoJQHBhcmFtIG1kX21vZGVsIEludGVybmFsIG1ldGFkYXRhIG1vZGVsCglAcGFyYW0gdGFnX3RhYmxlIFRhZyBpbmZvIHRhYmxlCglAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQoJKi8KCUJPT0wgYWRkTWV0YWRhdGFNb2RlbChNRE1PREVMIG1kX21vZGVsLCBUYWdJbmZvICp0YWdfdGFibGUpOwoKcHVibGljOgoJLy8vIERlc3RydWN0b3IKCX5UYWdMaWIoKTsKCgkvKioKCUByZXR1cm4gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgVGFnTGliIGluc3RhbmNlCgkqLwoJc3RhdGljIFRhZ0xpYiYgaW5zdGFuY2UoKTsKCgkvKioKCUdpdmVuIGEgdGFnIElELCByZXR1cm5zIGl0cyBUYWdJbmZvIGRlc2NyaXB0b3IKCUBwYXJhbSBtZF9tb2RlbCBJbnRlcm5hbCBtZXRhZGF0YSBtb2RlbAoJQHBhcmFtIHRhZ0lEIHRhZyBJRAoJQHJldHVybiBSZXR1cm5zIHRoZSBUYWdJbmZvIGRlc2NyaXB0b3IgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQoJKi8KCWNvbnN0IFRhZ0luZm8qIGdldFRhZ0luZm8oTURNT0RFTCBtZF9tb2RlbCwgV09SRCB0YWdJRCk7CgoJLyoqCglHaXZlbiBhIHRhZyBJRCwgcmV0dXJucyBpdHMgdGFnIGZpZWxkIG5hbWUuIAoJV2hlbiB0aGUgdGFnIGlzIHVua25vd24gYW5kIGRlZmF1bHRLZXkgaXMgbm90IE5VTEwsIGEgc3RyaW5nIHN1Y2ggYXMgIlRhZyAweDEyMzQiIGlzIHJldHVybmVkLiAKCVRoaXMgc3RyaW5nIGlzIGNvbnRhaW5lZCBpbiB0aGUgcHJvdmlkZWQgZGVmYXVsdEtleSBidWZmZXIgKGFzc3VtZWQgdG8gYmUgYW4gYXJyYXkgb2YgYXQgbGVhc3QgMTYgY2hhcnMpLiAKCUBwYXJhbSBtZF9tb2RlbCBJbnRlcm5hbCBtZXRhZGF0YSBtb2RlbAoJQHBhcmFtIHRhZ0lEIHRhZyBJRAoJQHBhcmFtIGRlZmF1bHRLZXkgQXNzdW1lZCB0byBiZSBhbiBhcnJheSBvZiAxNiBjaGFycy4gSWYgbm90IE5VTEwsIGJ1aWxkIGEga2V5IGZvciB1bmtub3duIHRhZ3MKCUByZXR1cm4gUmV0dXJucyB0aGUgdGFnIGZpZWxkIG5hbWUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBhbiAndW5rbm93biB0YWcnIHN0cmluZyBjb250YWluZWQgaW4gZGVmYXVsdEtleSBvdGhlcndpc2UKCSovCgljb25zdCBjaGFyKiBnZXRUYWdGaWVsZE5hbWUoTURNT0RFTCBtZF9tb2RlbCwgV09SRCB0YWdJRCwgY2hhciAqZGVmYXVsdEtleSk7CgoJLyoqCglHaXZlbiBhIHRhZyBJRCwgcmV0dXJucyBpdHMgZGVzY3JpcHRpb24uIAoJV2hlbiB0aGUgdGFnIGhhcyBubyBkZXNjcmlwdGlvbiwgYSBOVUxMIHZhbHVlIGlzIHJldHVybmVkLgoJQHBhcmFtIG1kX21vZGVsIEludGVybmFsIG1ldGFkYXRhIG1vZGVsCglAcGFyYW0gdGFnSUQgdGFnIElECglAcmV0dXJuIFJldHVybnMgdGhlIHRhZyBkZXNjcmlwdGlvbiBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCgkqLwoJY29uc3QgY2hhciogZ2V0VGFnRGVzY3JpcHRpb24oTURNT0RFTCBtZF9tb2RlbCwgV09SRCB0YWdJRCk7CgoJLyoqCglHaXZlbiBhIHRhZyBmaWVsZCBuYW1lLCByZXR1cm5zIGl0cyB0YWcgSUQuIAoJV2hlbiB0aGUgdGFnIGRvZXNuJ3QgZXhpc3RzLCBhIHZhbHVlICctMScgaXMgcmV0dXJuZWQuCglAcGFyYW0gbWRfbW9kZWwgSW50ZXJuYWwgbWV0YWRhdGEgbW9kZWwKCUBwYXJhbSBrZXkgdGFnIGZpZWxkIG5hbWUKCUByZXR1cm4gUmV0dXJucyB0aGUgdGFnIElEIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgLTEgb3RoZXJ3aXNlCgkqLwoJaW50IGdldFRhZ0lEKE1ETU9ERUwgbWRfbW9kZWwsIGNvbnN0IGNoYXIgKmtleSk7CgoJLyoqCglQZXJmb3JtIGEgY29udmVyc2lvbiBiZXR3ZWVuIGludGVybmFsIG1ldGFkYXRhIG1vZGVscyBhbmQgRnJlZUltYWdlIHB1YmxpYyBtZXRhZGF0YSBtb2RlbHMKCUBwYXJhbSBtZF9tb2RlbCBJbnRlcm5hbCBtZXRhZGF0YSBtb2RlbAoJKi8KCUZSRUVfSU1BR0VfTURNT0RFTCBnZXRGcmVlSW1hZ2VNb2RlbChNRE1PREVMIG1vZGVsKTsKCn07CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBDb25zdGFudCBzdHJpbmdzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gTmFtZSBvZiB0aGUgWE1QIGZpZWxkCnN0YXRpYyBjb25zdCBjaGFyICpnX1RhZ0xpYl9YTVBGaWVsZE5hbWUgPSAiWE1MUGFja2V0IjsKCi8vLyBOYW1lIG9mIHRoZSBFeGlmIHJhdyBmaWVsZApzdGF0aWMgY29uc3QgY2hhciAqZ19UYWdMaWJfRXhpZlJhd0ZpZWxkTmFtZSA9ICJFeGlmUmF3IjsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIE1ldGFkYXRhIHJvdXRpbmVzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKZXh0ZXJuICJDIiB7CiNlbmRpZgoKLy8gSlBFRyAvIEpQRUctWFIgRXhpZiBwcm9maWxlIChzZWUgRXhpZi5jcHApCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJPT0wganBlZ19yZWFkX2V4aWZfcHJvZmlsZShGSUJJVE1BUCAqZGliLCBjb25zdCBCWVRFICpkYXRhcHRyLCB1bnNpZ25lZCBkYXRhbGVuKTsKQk9PTCBqcGVnX3JlYWRfZXhpZl9wcm9maWxlX3JhdyhGSUJJVE1BUCAqZGliLCBjb25zdCBCWVRFICpwcm9maWxlLCB1bnNpZ25lZCBsZW5ndGgpOwpCT09MIGpwZWd4cl9yZWFkX2V4aWZfcHJvZmlsZShGSUJJVE1BUCAqZGliLCBjb25zdCBCWVRFICpwcm9maWxlLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIGZpbGVfb2Zmc2V0KTsKQk9PTCBqcGVneHJfcmVhZF9leGlmX2dwc19wcm9maWxlKEZJQklUTUFQICpkaWIsIGNvbnN0IEJZVEUgKnByb2ZpbGUsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgZmlsZV9vZmZzZXQpOwoKQk9PTCB0aWZmX2dldF9pZmRfcHJvZmlsZShGSUJJVE1BUCAqZGliLCBGUkVFX0lNQUdFX01ETU9ERUwgbWRfbW9kZWwsIEJZVEUgKipwcGJQcm9maWxlLCB1bnNpZ25lZCAqdVByb2ZpbGVMZW5ndGgpOwoKCi8vIEpQRUcgLyBUSUZGIElQVEMgcHJvZmlsZSAoc2VlIElQVEMuY3BwKQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCT09MIHJlYWRfaXB0Y19wcm9maWxlKEZJQklUTUFQICpkaWIsIGNvbnN0IEJZVEUgKmRhdGFwdHIsIHVuc2lnbmVkIGludCBkYXRhbGVuKTsKQk9PTCB3cml0ZV9pcHRjX3Byb2ZpbGUoRklCSVRNQVAgKmRpYiwgQllURSAqKnByb2ZpbGUsIHVuc2lnbmVkICpwcm9maWxlX3NpemUpOwoKI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCn0KI2VuZGlmCgoKI2VuZGlmIC8vIEZSRUVJTUFHRVRBR19ICgoK