LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqLwoKI2lmbmRlZiBfX1dJTkVfRE9TRVhFX0gKI2RlZmluZSBfX1dJTkVfRE9TRVhFX0gKCiNpbmNsdWRlICJ3aW5lL3dpbmRlZjE2LmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiICAgLyogZm9yIExQU1RBUlRVUElORk8zMkEgKi8KI2luY2x1ZGUgIndpbm50LmgiICAgICAvKiBmb3IgUENPTlRFWFQgKi8KCnN0cnVjdCBfRE9TRVZFTlQ7Cgp0eXBlZGVmIHZvaWQgKCpET1NSRUxBWSkoQ09OVEVYVDg2Kix2b2lkKik7CgojZGVmaW5lIERPU19QUklPUklUWV9SRUFMVElNRSAwICAvKiBJUlEwICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX0tFWUJPQVJEIDEgIC8qIElSUTEgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfVkdBICAgICAgMiAgLyogSVJROSAqLwojZGVmaW5lIERPU19QUklPUklUWV9NT1VTRSAgICA1ICAvKiBJUlExMiAqLwojZGVmaW5lIERPU19QUklPUklUWV9TRVJJQUwgICAxMCAvKiBJUlE0ICovCgpleHRlcm4gV09SRCBET1NWTV9wc3A7ICAgICAvKiBwc3Agb2YgY3VycmVudCBET1MgdGFzayAqLwpleHRlcm4gV09SRCBET1NWTV9yZXR2YWw7ICAvKiByZXR1cm4gdmFsdWUgb2YgcHJldmlvdXMgRE9TIHRhc2sgKi8KCiNpZiBkZWZpbmVkKGxpbnV4KSAmJiBkZWZpbmVkKF9faTM4Nl9fKQojZGVmaW5lIE1aX1NVUFBPUlRFRAojZW5kaWYgLyogbGludXgtaTM4NiAqLwoKI2RlZmluZSBWODZfRkxBRyAweDAwMDIwMDAwCgpleHRlcm4gdm9pZCBXSU5BUEkgTVpfTG9hZEltYWdlKCBMUENTVFIgZmlsZW5hbWUsIEhBTkRMRSBoRmlsZSApOwpleHRlcm4gQk9PTCBXSU5BUEkgTVpfRXhlYyggQ09OVEVYVDg2ICpjb250ZXh0LCBMUENTVFIgZmlsZW5hbWUsIEJZVEUgZnVuYywgTFBWT0lEIHBhcmFtYmxrICk7CmV4dGVybiB2b2lkIFdJTkFQSSBNWl9FeGl0KCBDT05URVhUODYgKmNvbnRleHQsIEJPT0wgY3NfcHNwLCBXT1JEIHJldHZhbCApOwpleHRlcm4gQk9PTCBXSU5BUEkgTVpfQ3VycmVudCggdm9pZCApOwpleHRlcm4gdm9pZCBXSU5BUEkgTVpfQWxsb2NEUE1JVGFzayggdm9pZCApOwpleHRlcm4gdm9pZCBXSU5BUEkgTVpfUnVuSW5UaHJlYWQoIFBBUENGVU5DIHByb2MsIFVMT05HX1BUUiBhcmcgKTsKZXh0ZXJuIElOVCBXSU5BUEkgRE9TVk1fRW50ZXIoIENPTlRFWFQ4NiAqY29udGV4dCApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fV2FpdCggSU5UIHJlYWRfcGlwZSwgSEFORExFIGhPYmplY3QgKTsKZXh0ZXJuIERXT1JEIFdJTkFQSSBET1NWTV9Mb29wKCBMUFZPSUQgbHBFeHRyYSApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fUXVldWVFdmVudCggSU5UIGlycSwgSU5UIHByaW9yaXR5LCBET1NSRUxBWSByZWxheSwgTFBWT0lEIGRhdGEgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX1BJQ19pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9TZXRUaW1lciggVUlOVCB0aWNrcyApOwpleHRlcm4gVUlOVCBXSU5BUEkgRE9TVk1fR2V0VGltZXIoIHZvaWQgKTsKZXh0ZXJuIEZBUlBST0MxNiBET1NWTV9HZXRSTUhhbmRsZXIoIEJZVEUgaW50bnVtICk7CmV4dGVybiB2b2lkIERPU1ZNX1NldFJNSGFuZGxlciggQllURSBpbnRudW0sIEZBUlBST0MxNiBoYW5kbGVyICk7CmV4dGVybiB2b2lkIERPU1ZNX1JlYWxNb2RlSW50ZXJydXB0KCBCWVRFIGludG51bSwgQ09OVEVYVDg2ICpjb250ZXh0ICk7CgovKiBkZXZpY2VzLmMgKi8KZXh0ZXJuIHZvaWQgRE9TREVWX0luc3RhbGxET1NEZXZpY2VzKHZvaWQpOwpleHRlcm4gRFdPUkQgRE9TREVWX0NvbnNvbGUodm9pZCk7CmV4dGVybiBEV09SRCBET1NERVZfRmluZENoYXJEZXZpY2UoY2hhcipuYW1lKTsKZXh0ZXJuIGludCBET1NERVZfUGVlayhEV09SRCBkZXYsIEJZVEUqZGF0YSk7CmV4dGVybiBpbnQgRE9TREVWX1JlYWQoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4pOwpleHRlcm4gaW50IERPU0RFVl9Xcml0ZShEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1ZmxlbiwgaW50IHZlcmlmeSk7CmV4dGVybiBpbnQgRE9TREVWX0lvY3RsUmVhZChEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1Zmxlbik7CmV4dGVybiBpbnQgRE9TREVWX0lvY3RsV3JpdGUoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4pOwoKLyogaW50MDkuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MDlIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MDlTZW5kU2NhbihCWVRFIHNjYW4sQllURSBhc2NpaSk7CmV4dGVybiBCWVRFIFdJTkFQSSBET1NWTV9JbnQwOVJlYWRTY2FuKEJZVEUqYXNjaWkpOwoKLyogaW50MTAuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTBIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MTYuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTZIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gaW50IFdJTkFQSSBET1NWTV9JbnQxNlJlYWRDaGFyKEJZVEUqYXNjaWksQllURSpzY2FuLEJPT0wgcGVlayk7CmV4dGVybiBpbnQgV0lOQVBJIERPU1ZNX0ludDE2QWRkQ2hhcihCWVRFIGFzY2lpLEJZVEUgc2Nhbik7CgovKiBpbnQxNy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxN0hhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQxOS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxOUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyMC5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyMEhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyMS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyMUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyOS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyOUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQzMS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzMUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQzMy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzM0hhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzM01lc3NhZ2UoVUlOVCxXUEFSQU0sTFBBUkFNKTsKCi8qIHhtcy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBYTVNfSGFuZGxlcihDT05URVhUODYqKTsKCiNlbmRpZiAvKiBfX1dJTkVfRE9TRVhFX0ggKi8K