LyoKICogQ29weXJpZ2h0IChDKSAyMDA5IEp1ZXJnZW4gQmVpc2VydCwgUGVuZ3V0cm9uaXgKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICoKICovCgovKioKICogQGZpbGUKICogQGJyaWVmIGE5bTI0NDAgU3BlY2lmaWMgQm9hcmQgSW5pdGlhbGl6YXRpb24gcm91dGluZXMKICoKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxkcml2ZXIuaD4KI2luY2x1ZGUgPGluaXQuaD4KI2luY2x1ZGUgPGFzbS9hcm1saW51eC5oPgojaW5jbHVkZSA8Z2VuZXJhdGVkL21hY2gtdHlwZXMuaD4KI2luY2x1ZGUgPHBhcnRpdGlvbi5oPgojaW5jbHVkZSA8bmFuZC5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxtYWNoL3MzYzI0eDAtaW9tYXAuaD4KI2luY2x1ZGUgPG1hY2gvczNjMjR4MC1uYW5kLmg+CiNpbmNsdWRlIDxtYWNoL3MzYzI0eHgtZ2VuZXJpYy5oPgoKI2luY2x1ZGUgImJhc2Vib2FyZHMuaCIKCnN0YXRpYyBzdHJ1Y3QgbWVtb3J5X3BsYXRmb3JtX2RhdGEgcmFtX3BkYXRhID0gewoJLm5hbWUJCT0gInJhbTAiLAoJLmZsYWdzCQk9IERFVkZTX1JEV1IsCn07CgpzdGF0aWMgc3RydWN0IGRldmljZV9kIHNkcmFtX2RldiA9IHsKCS5pZAkJPSAtMSwKCS5uYW1lCQk9ICJtZW0iLAoJLm1hcF9iYXNlCT0gQ1M2X0JBU0UsCgkucGxhdGZvcm1fZGF0YQk9ICZyYW1fcGRhdGEsCn07CgpzdGF0aWMgc3RydWN0IHMzYzI0eDBfbmFuZF9wbGF0Zm9ybV9kYXRhIG5hbmRfaW5mbyA9IHsKCS5uYW5kX3RpbWluZyA9IENBTENfTkZDT05GX1RJTUlORyhBOU0yNDQwX1RBQ0xTLCBBOU0yNDQwX1RXUlBIMCwgQTlNMjQ0MF9UV1JQSDEpCn07CgpzdGF0aWMgc3RydWN0IGRldmljZV9kIG5hbmRfZGV2ID0gewoJLmlkCSAgPSAtMSwKCS5uYW1lICAgICA9ICJzM2MyNHgwX25hbmQiLAoJLm1hcF9iYXNlID0gUzNDMjRYMF9OQU5EX0JBU0UsCgkucGxhdGZvcm1fZGF0YQk9ICZuYW5kX2luZm8sCn07CgovKgogKiBjczg5MDAgbmV0d29yayBjb250cm9sbGVyIG9uYm9hcmQKICogQ29ubmVjdGVkIHRvIENTIGxpbmUgNSArIEEyNCBhbmQgaW50ZXJydXB0IGxpbmUgRUlOVDksCiAqIGRhdGEgd2lkdGggaXMgMTYgYml0CiAqLwpzdGF0aWMgc3RydWN0IGRldmljZV9kIG5ldHdvcmtfZGV2ID0gewoJLmlkCSAgPSAtMSwKCS5uYW1lICAgICA9ICJjczg5MDAiLAoJLm1hcF9iYXNlID0gQ1M1X0JBU0UgKyAoMSA8PCAyNCkgKyAweDMwMCwKCS5zaXplICAgICA9IDE2LAp9OwoKc3RhdGljIGludCBhOW0yNDQwX2NoZWNrX2Zvcl9yYW0odWludDMyX3QgYWRkcikKewoJdWludDMyX3QgdG1wMSwgdG1wMjsKCWludCByYyA9IDA7CgoJdG1wMSA9IHJlYWRsKGFkZHIpOwoJdG1wMiA9IHJlYWRsKGFkZHIgKyBzaXplb2YodWludDMyX3QpKTsKCgl3cml0ZWwoMHhhYWFhYWFhYSwgYWRkcik7Cgl3cml0ZWwoMHg1NTU1NTU1NSwgYWRkciArIHNpemVvZih1aW50MzJfdCkpOwoJaWYgKChyZWFkbChhZGRyKSAhPSAweGFhYWFhYWFhKSB8fCAocmVhZGwoYWRkciArIHNpemVvZih1aW50MzJfdCkpICE9IDB4NTU1NTU1NTUpKQoJCXJjID0gMTsJLyogc2VlbXMgbm8gUkFNICovCgoJd3JpdGVsKDB4NTU1NTU1NTUsIGFkZHIpOwoJd3JpdGVsKDB4YWFhYWFhYWEsIGFkZHIgKyBzaXplb2YodWludDMyX3QpKTsKCWlmICgocmVhZGwoYWRkcikgIT0gMHg1NTU1NTU1NSkgfHwgKHJlYWRsKGFkZHIgKyBzaXplb2YodWludDMyX3QpKSAhPSAweGFhYWFhYWFhKSkKCQlyYyA9IDE7CS8qIHNlZW1zIG5vIFJBTSAqLwoKCXdyaXRlbCh0bXAxLCBhZGRyKTsKCXdyaXRlbCh0bXAyLCBhZGRyICsgc2l6ZW9mKHVpbnQzMl90KSk7CgoJcmV0dXJuIHJjOwp9CgpzdGF0aWMgdm9pZCBhOW0yNDQwX2Rpc2FibGVfc2Vjb25kX3NkcmFtX2Jhbmsodm9pZCkKewoJd3JpdGVsKHJlYWRsKEJBTktDT043KSAmIH4oMHgzIDw8IDE1KSxCQU5LQ09ONyk7Cgl3cml0ZWwocmVhZGwoTUlTQ0NSKSB8ICgxIDw8IDE4KSwgTUlTQ0NSKTsgLyogZGlzYWJsZSBjbG9jayAqLwp9CgpzdGF0aWMgaW50IGE5bTI0NDBfZGV2aWNlc19pbml0KHZvaWQpCnsKCXVpbnQzMl90IHJlZzsKCgkvKgoJICogVGhlIHNwZWNpYWwgU0RSQU0gc2V0dXAgY29kZSBmb3IgdGhpcyBtYWNoaW5lIHdpbGwgYWx3YXlzIGVuYWJsZQoJICogYm90aCBTRFJBTSBiYW5rcy4gQnV0IHRoZSBzZWNvbmQgU0RSQU0gZGV2aWNlIG1heSBub3QgZXhpc3RzIQoJICogU28gd2UgbXVzdCBjaGVjayBoZXJlLCBpZiB0aGUgc2Vjb25kIGJhbmsgaXMgcG9wdWxhdGVkIHRvIGdldCB0aGUKCSAqIGNvcnJlY3QgUkFNIHNpemUuCgkgKi8KCXN3aXRjaCAocmVhZGwoQkFOS1NJWkUpICYgMHg3KSB7CgljYXNlIDA6CgkJaWYgKGE5bTI0NDBfY2hlY2tfZm9yX3JhbShTM0MyNFgwX1NEUkFNX0JBU0UgKyAzMiAqIDEwMjQgKiAxMDI0KSkKCQkJYTltMjQ0MF9kaXNhYmxlX3NlY29uZF9zZHJhbV9iYW5rKCk7CgkJYnJlYWs7CgljYXNlIDE6CgkJaWYgKGE5bTI0NDBfY2hlY2tfZm9yX3JhbShTM0MyNFgwX1NEUkFNX0JBU0UgKyA2NCAqIDEwMjQgKiAxMDI0KSkKCQkJYTltMjQ0MF9kaXNhYmxlX3NlY29uZF9zZHJhbV9iYW5rKCk7CgkJYnJlYWs7CgljYXNlIDI6CgkJaWYgKGE5bTI0NDBfY2hlY2tfZm9yX3JhbShTM0MyNFgwX1NEUkFNX0JBU0UgKyAxMjggKiAxMDI0ICogMTAyNCkpCgkJCWE5bTI0NDBfZGlzYWJsZV9zZWNvbmRfc2RyYW1fYmFuaygpOwoJCWJyZWFrOwoJY2FzZSA0OgoJY2FzZSA1OgoJY2FzZSA2OgkJLyogbm90IHN1cHBvcnRlZCBvbiB0aGlzIG1hY2hpbmUgKi8KCQlicmVhazsKCWRlZmF1bHQ6CgkJaWYgKGE5bTI0NDBfY2hlY2tfZm9yX3JhbShTM0MyNFgwX1NEUkFNX0JBU0UgKyAxNiAqIDEwMjQgKiAxMDI0KSkKCQkJYTltMjQ0MF9kaXNhYmxlX3NlY29uZF9zZHJhbV9iYW5rKCk7CgkJYnJlYWs7Cgl9CgoJc2RyYW1fZGV2LnNpemUgPSBzM2MyNHgwX2dldF9tZW1vcnlfc2l6ZSgpOwoKCS8qIC0tLS0tLS0tLS0tIGNvbmZpZ3VyZSB0aGUgYWNjZXNzIHRvIHRoZSBvdXRlciBzcGFjZSAtLS0tLS0tLS0tICovCglyZWcgPSByZWFkbChCV1NDT04pOwoKCS8qIENTIzUgdG8gYWNjZXNzIHRoZSBuZXR3b3JrIGNvbnRyb2xsZXIgKi8KCXJlZyAmPSB+MHgwMGYwMDAwMDsKCXJlZyB8PSAgMHgwMGQwMDAwMDsJLyogMTYgYml0ICovCgl3cml0ZWwoMHgxZjRjLCBCQU5LQ09ONSk7CgoJd3JpdGVsKHJlZywgQldTQ09OKTsKCiNpZmRlZiBDT05GSUdfTUFDSF9BOU0yNDEwREVWCglhOW0yNDEwZGV2X2RldmljZXNfaW5pdCgpOwojZW5kaWYKCgkvKiByZWxlYXNlIHRoZSByZXNldCBzaWduYWwgdG8gZXh0ZXJuYWwgZGV2aWNlcyAqLwoJcmVnID0gcmVhZGwoTUlTQ0NSKTsKCXJlZyB8PSAweDEwMDAwOwoJd3JpdGVsKHJlZywgTUlTQ0NSKTsKCgkvKiAtLS0tLS0tLS0tLSB0aGUgZGV2aWNlcyB0aGUgYm9vdCBsb2FkZXIgc2hvdWxkIHdvcmsgd2l0aCAtLS0tLS0tLSAqLwoJcmVnaXN0ZXJfZGV2aWNlKCZuYW5kX2Rldik7CglyZWdpc3Rlcl9kZXZpY2UoJnNkcmFtX2Rldik7CglyZWdpc3Rlcl9kZXZpY2UoJm5ldHdvcmtfZGV2KTsKCiNpZmRlZiBDT05GSUdfTkFORAoJLyogLS0tLS0tLS0tLS0gYWRkIHNvbWUgdml0YWwgcGFydGl0aW9ucyAtLS0tLS0tLSAqLwoJZGV2ZnNfYWRkX3BhcnRpdGlvbigibmFuZDAiLCAweDAwMDAwLCAweDQwMDAwLCBQQVJUSVRJT05fRklYRUQsICJzZWxmX3JhdyIpOwoJZGV2X2FkZF9iYl9kZXYoInNlbGZfcmF3IiwgInNlbGYwIik7CgoJZGV2ZnNfYWRkX3BhcnRpdGlvbigibmFuZDAiLCAweDQwMDAwLCAweDIwMDAwLCBQQVJUSVRJT05fRklYRUQsICJlbnZfcmF3Iik7CglkZXZfYWRkX2JiX2RldigiZW52X3JhdyIsICJlbnYwIik7CiNlbmRpZgoJYXJtbGludXhfYWRkX2RyYW0oJnNkcmFtX2Rldik7Cglhcm1saW51eF9zZXRfYm9vdHBhcmFtcygodm9pZCAqKXNkcmFtX2Rldi5tYXBfYmFzZSArIDB4MTAwKTsKCWFybWxpbnV4X3NldF9hcmNoaXRlY3R1cmUoTUFDSF9UWVBFX0E5TTI0NDApOwoKCXJldHVybiAwOwp9CgpkZXZpY2VfaW5pdGNhbGwoYTltMjQ0MF9kZXZpY2VzX2luaXQpOwoKI2lmZGVmIENPTkZJR19TM0MyNFhYX05BTkRfQk9PVAp2b2lkIF9fYmFyZV9pbml0IG5hbmRfYm9vdCh2b2lkKQp7CglzM2MyNHgwX25hbmRfbG9hZF9pbWFnZSgodm9pZCAqKVRFWFRfQkFTRSwgMjU2ICogMTAyNCwgMCk7Cn0KI2VuZGlmCgpzdGF0aWMgc3RydWN0IGRldmljZV9kIGE5bTI0NDBfc2VyaWFsX2RldmljZSA9IHsKCS5pZAkgID0gLTEsCgkubmFtZSAgICAgPSAiczNjMjR4MF9zZXJpYWwiLAoJLm1hcF9iYXNlID0gVUFSVDFfQkFTRSwKCS5zaXplICAgICA9IFVBUlQxX1NJWkUsCn07CgpzdGF0aWMgaW50IGE5bTI0NDBfY29uc29sZV9pbml0KHZvaWQpCnsKCXJlZ2lzdGVyX2RldmljZSgmYTltMjQ0MF9zZXJpYWxfZGV2aWNlKTsKCXJldHVybiAwOwp9Cgpjb25zb2xlX2luaXRjYWxsKGE5bTI0NDBfY29uc29sZV9pbml0KTsKCi8qKiBAcGFnZSBhOW0yNDQwIERJR0kncyBhOW0yNDQwCgpUaGlzIENQVSBjYXJkIGlzIGJhc2VkIG9uIGEgU2Ftc3VuZyBTM0MyNDQwIENQVS4gVGhlIGNhcmQgaXMgc2hpcHBlZCB3aXRoOgoKLSBTM0MyNDQwXEA0MDAgTUh6IG9yIDUzMyBNSHogKEFSTTkyMFQvQVJNdjRUKQotIDE2LjkzNDQgTUh6IGNyeXN0YWwgcmVmZXJlbmNlCi0gU0RSQU0gMzIvNjQvMTI4IE1pQgogICAtIFNhbXN1bmcgSzRNNTYzMjMzRS1FRTFIIChvbmUgb3IgdHdvIGRldmljZXMgZm9yIDMyIE1pQiBvciA2NCBNaUIpCiAgICAgLSAyTSB4IDMyYml0IHggNCBCYW5rcyBNb2JpbGUgU0RSQU0KICAgICAtIENMMlxAMTAwIE1IeiAoQ0FTL1JBUyBkZWxheSAxOW5zKQogICAgIC0gMTA1IE1IeiBtYXgKICAgICAtIGNvbGx1bW4gYWRkcmVzcyBzaXplIGlzIDkgYml0cwogICAgIC0gUm93IGN5Y2xlIHRpbWU6IDY5bnMKICAgLSBTYW1zdW5nIEs0TTUxMzIzM0MtREc3NSAob25lIG9yIHR3byBkZXZpY2VzIGZvciA2NCBNaUIgb3IgMTI4IE1pQikKICAgICAtIDRNIHggMzJiaXQgeCA0IEJhbmtzIE1vYmlsZSBTRFJBTQogICAgIC0gQ0wyXEAxMDBNSHogKENBUy9SQVMgZGVsYXkgMThucykKICAgICAtIDExMSBNSHogbWF4CiAgICAgLSBjb2xsdW1uIGFkZHJlc3Mgc2l6ZSBpcyA5IGJpdHMKICAgICAtIFJvdyBjeWNsZSB0aW1lOiA2M25zCiAgIC0gNjRtcyByZWZyZXNoIHBlcmlvZCAoNGspCiAgIC0gOTAgcGluIEZCR0EKICAgLSAzMiBiaXQgZGF0YSBiaXRzCiAgIC0gRXh0ZW5kZWQgdGVtcGVyYXR1cmUgcmFuZ2UgKC0yNbBDLi4uODWwQykKLSBOQU5EIEZsYXNoIDMyLzY0LzEyOCBNaUIKICAgLSBTYW1zdW5nIEtNMjlVNTEyVCAoTkFORDAxR1czQTBBTjYpCiAgICAgLSA2NCBNaUIgMywzViA4LWJpdAogICAgIC0gSUQ6IDB4RUMsIDB4NzYsIDB4Pz8sIDB4QkQKICAgLSBTYW1zdW5nIEtNMjlVMjU2VAogICAgIC0gMzIgTWlCIDMsM1YgOC1iaXQKICAgICAtIElEOiAweEVDLCAweDc1LCAweD8/LCAweEJECiAgIC0gU1QgTWljcm8KICAgICAtIDEyOCBNaUIgMywzViA4LWJpdAogICAgIC0gSUQ6IDB4MjAsIDB4NzkKICAgLSAzMG5zLzQwbnMvMjBucwotIEkyQyBpbnRlcmZhY2UsIDEwMCBLSHogYW5kIDQwMCBLSHoKICAtIFJlYWwgVGltZSBDbG9jawogICAgLSBEYWxsYXMgRFMxMzM3CiAgICAtIGFkZHJlc3MgMHg2OAogIC0gRUVQUk9NCiAgICAtIFNUIE0yNExDNjQKICAgIC0gYWRkcmVzcyAweDUwCiAgICAtIDE2Yml0IGFkZHJlc3NpbmcKLSBMQ0QgaW50ZXJmYWNlCi0gVG91Y2ggU2NyZWVuIGludGVyZmFjZQotIENhbWVyYSBpbnRlcmZhY2UKLSBJMlMgaW50ZXJmYWNlCi0gQUM5NyBBdWRpby1DT0RFQyBpbnRlcmZhY2UKLSBTRCBjYXJkIGludGVyZmFjZQotIDMgc2VyaWFsIFJTMjMyIGludGVyZmFjZXMKLSBIb3N0IGFuZCBkZXZpY2UgVVNCIGludGVyZmFjZSwgVVNCMS4xIGNvbXBsaWFudAotIEV0aGVybmV0IGludGVyZmFjZQogIC0gMTBNYnBzLCBDaXJydXMgTG9naWMsIENTODkwMEEgKG9uIHRoZSBDUFUgY2FyZCkKLSBTUEkgaW50ZXJmYWNlCi0gSlRBRyBpbnRlcmZhY2UKCkhvdyB0byBnZXQgdGhlIGJpbmFyeSBpbWFnZToKClVzaW5nIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb246CgpAY29kZQptYWtlIEFSQ0g9YXJtIGE5bTI0NDBfZGVmY29uZmlnCkBlbmRjb2RlCgpCdWlsZCB0aGUgYmluYXJ5IGltYWdlOgoKQGNvZGUKbWFrZSBBUkNIPWFybSBDUk9TU19DT01QSUxFPWFybXY0Y29tcGlsZXIKQGVuZGNvZGUKCkBub3RlIHJlcGxhY2UgdGhlIGFybXY0Y29tcGlsZXIgd2l0aCB5b3VyIEFSTSB2NCBjcm9zcyBjb21waWxlci4KCiovCg==