LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX0RPU0VYRV9ICiNkZWZpbmUgX19XSU5FX0RPU0VYRV9ICgojaW5jbHVkZSAid2luZS93aW5kZWYxNi5oIgojaW5jbHVkZSAid2luYmFzZS5oIiAgIC8qIGZvciBMUFNUQVJUVVBJTkZPMzJBICovCiNpbmNsdWRlICJ3aW5udC5oIiAgICAgLyogZm9yIFBDT05URVhUICovCiNpbmNsdWRlICJ3aW5jb24uaCIgICAgLyogZm9yIE1PVVNFX0VWRU5UX1JFQ09SRCAqLwoKc3RydWN0IF9ET1NFVkVOVDsKCnR5cGVkZWYgdm9pZCAoKkRPU1JFTEFZKShDT05URVhUODYqLHZvaWQqKTsKCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1JFQUxUSU1FIDAgIC8qIElSUTAgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfS0VZQk9BUkQgMSAgLyogSVJRMSAqLwojZGVmaW5lIERPU19QUklPUklUWV9WR0EgICAgICAyICAvKiBJUlE5ICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX01PVVNFICAgIDUgIC8qIElSUTEyICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1NFUklBTCAgIDEwIC8qIElSUTQgKi8KCmV4dGVybiBXT1JEIERPU1ZNX3BzcDsgICAgIC8qIHBzcCBvZiBjdXJyZW50IERPUyB0YXNrICovCmV4dGVybiBXT1JEIERPU1ZNX3JldHZhbDsgIC8qIHJldHVybiB2YWx1ZSBvZiBwcmV2aW91cyBET1MgdGFzayAqLwoKI2lmIGRlZmluZWQobGludXgpICYmIGRlZmluZWQoX19pMzg2X18pCiNkZWZpbmUgTVpfU1VQUE9SVEVECiNlbmRpZiAvKiBsaW51eC1pMzg2ICovCgojZGVmaW5lIFY4Nl9GTEFHIDB4MDAwMjAwMDAKCmV4dGVybiB2b2lkIFdJTkFQSSBNWl9Mb2FkSW1hZ2UoIExQQ1NUUiBmaWxlbmFtZSwgSEFORExFIGhGaWxlICk7CmV4dGVybiBCT09MIFdJTkFQSSBNWl9FeGVjKCBDT05URVhUODYgKmNvbnRleHQsIExQQ1NUUiBmaWxlbmFtZSwgQllURSBmdW5jLCBMUFZPSUQgcGFyYW1ibGsgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIE1aX0V4aXQoIENPTlRFWFQ4NiAqY29udGV4dCwgQk9PTCBjc19wc3AsIFdPUkQgcmV0dmFsICk7CmV4dGVybiBCT09MIFdJTkFQSSBNWl9DdXJyZW50KCB2b2lkICk7CmV4dGVybiB2b2lkIFdJTkFQSSBNWl9BbGxvY0RQTUlUYXNrKCB2b2lkICk7CmV4dGVybiB2b2lkIFdJTkFQSSBNWl9SdW5JblRocmVhZCggUEFQQ0ZVTkMgcHJvYywgVUxPTkdfUFRSIGFyZyApOwpleHRlcm4gSU5UIFdJTkFQSSBET1NWTV9FbnRlciggQ09OVEVYVDg2ICpjb250ZXh0ICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9XYWl0KCBJTlQgcmVhZF9waXBlLCBIQU5ETEUgaE9iamVjdCApOwpleHRlcm4gRFdPUkQgV0lOQVBJIERPU1ZNX0xvb3AoIExQVk9JRCBscEV4dHJhICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9RdWV1ZUV2ZW50KCBJTlQgaXJxLCBJTlQgcHJpb3JpdHksIERPU1JFTEFZIHJlbGF5LCBMUFZPSUQgZGF0YSApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fUElDX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX1NldFRpbWVyKCBVSU5UIHRpY2tzICk7CmV4dGVybiBVSU5UIFdJTkFQSSBET1NWTV9HZXRUaW1lciggdm9pZCApOwpleHRlcm4gRkFSUFJPQzE2IERPU1ZNX0dldFJNSGFuZGxlciggQllURSBpbnRudW0gKTsKZXh0ZXJuIHZvaWQgRE9TVk1fU2V0Uk1IYW5kbGVyKCBCWVRFIGludG51bSwgRkFSUFJPQzE2IGhhbmRsZXIgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fUmVhbE1vZGVJbnRlcnJ1cHQoIEJZVEUgaW50bnVtLCBDT05URVhUODYgKmNvbnRleHQgKTsKCi8qIGRldmljZXMuYyAqLwpleHRlcm4gdm9pZCBET1NERVZfSW5zdGFsbERPU0RldmljZXModm9pZCk7CmV4dGVybiBEV09SRCBET1NERVZfQ29uc29sZSh2b2lkKTsKZXh0ZXJuIERXT1JEIERPU0RFVl9GaW5kQ2hhckRldmljZShjaGFyKm5hbWUpOwpleHRlcm4gaW50IERPU0RFVl9QZWVrKERXT1JEIGRldiwgQllURSpkYXRhKTsKZXh0ZXJuIGludCBET1NERVZfUmVhZChEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1Zmxlbik7CmV4dGVybiBpbnQgRE9TREVWX1dyaXRlKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuLCBpbnQgdmVyaWZ5KTsKZXh0ZXJuIGludCBET1NERVZfSW9jdGxSZWFkKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuKTsKZXh0ZXJuIGludCBET1NERVZfSW9jdGxXcml0ZShEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1Zmxlbik7CgovKiBpbnQwOS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQwOUhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQwOVNlbmRTY2FuKEJZVEUgc2NhbixCWVRFIGFzY2lpKTsKZXh0ZXJuIEJZVEUgV0lOQVBJIERPU1ZNX0ludDA5UmVhZFNjYW4oQllURSphc2NpaSk7CgovKiBpbnQxMC5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxMEhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9QdXRDaGFyKEJZVEUgYXNjaWkpOwoKLyogaW50MTYuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTZIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gaW50IFdJTkFQSSBET1NWTV9JbnQxNlJlYWRDaGFyKEJZVEUqYXNjaWksQllURSpzY2FuLEJPT0wgcGVlayk7CmV4dGVybiBpbnQgV0lOQVBJIERPU1ZNX0ludDE2QWRkQ2hhcihCWVRFIGFzY2lpLEJZVEUgc2Nhbik7CgovKiBpbnQxNy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxN0hhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQxOS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxOUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyMC5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyMEhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyMS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyMUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyOS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyOUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQzMS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzMUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQzMy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzM0hhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzM01lc3NhZ2UoVUlOVCxXUEFSQU0sTFBBUkFNKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDMzQ29uc29sZShNT1VTRV9FVkVOVF9SRUNPUkQqKTsKCi8qIGludDY3LmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDY3SGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIEVNU19Jb2N0bF9IYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogeG1zLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIFhNU19IYW5kbGVyKENPTlRFWFQ4NiopOwoKI2VuZGlmIC8qIF9fV0lORV9ET1NFWEVfSCAqLwo=