LyoKICAgIGkyYy12aWEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgIExpbnV4IGtlcm5lbCBtb2R1bGVzCiAgICAgICAgICAgICAgICBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwoKICAgIGkyYyBTdXBwb3J0IGZvciBWaWEgVGVjaG5vbG9naWVzIDgyQzU4NkIgU291dGggQnJpZGdlCgogICAgQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoqLwoKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKLyogUG93ZXIgbWFuYWdlbWVudCByZWdpc3RlcnMgKi8KI2RlZmluZSBQTV9DRkdfUkVWSUQJMHgwOAkvKiBzaWxpY29uIHJldmlzaW9uIGNvZGUgKi8KI2RlZmluZSBQTV9DRkdfSU9CQVNFMAkweDIwCiNkZWZpbmUgUE1fQ0ZHX0lPQkFTRTEJMHg0OAoKI2RlZmluZSBJMkNfRElSCQkocG1faW9fYmFzZSsweDQwKQojZGVmaW5lIEkyQ19PVVQJCShwbV9pb19iYXNlKzB4NDIpCiNkZWZpbmUgSTJDX0lOCQkocG1faW9fYmFzZSsweDQ0KQojZGVmaW5lIEkyQ19TQ0wJCTB4MDIJLyogY2xvY2sgYml0IGluIERJUi9PVVQvSU4gcmVnaXN0ZXIgKi8KI2RlZmluZSBJMkNfU0RBCQkweDA0CgovKiBpby1yZWdpb24gcmVzZXJ2YXRpb24gKi8KI2RlZmluZSBJT1NQQUNFCQkweDA2CiNkZWZpbmUgSU9URVhUCQkidmlhLWkyYyIKCnN0YXRpYyB1MTYgcG1faW9fYmFzZSA9IDA7CgovKgogICBJdCBkb2VzIG5vdCBhcHBlYXIgZnJvbSB0aGUgZGF0YXNoZWV0IHRoYXQgdGhlIEdQSU8gcGlucyBhcmUKICAgb3BlbiBkcmFpbi4gU28gYSB3ZSBzZXQgYSBsb3cgdmFsdWUgYnkgc2V0dGluZyB0aGUgZGlyZWN0aW9uIHRvCiAgIG91dHB1dCBhbmQgYSBoaWdoIHZhbHVlIGJ5IHNldHRpbmcgdGhlIGRpcmVjdGlvbiB0byBpbnB1dCBhbmQKICAgcmVseWluZyBvbiB0aGUgcmVxdWlyZWQgSTJDIHB1bGx1cC4gVGhlIGRhdGEgdmFsdWUgaXMgaW5pdGlhbGl6ZWQKICAgdG8gMCBpbiB2aWFfaW5pdCgpIGFuZCBuZXZlciBjaGFuZ2VkLgoqLwpzdGF0aWMgdm9pZCBiaXRfdmlhX3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCnsKCW91dGIoc3RhdGUgPyBpbmIoSTJDX0RJUikgJiB+STJDX1NDTCA6IGluYihJMkNfRElSKSB8IEkyQ19TQ0wsIEkyQ19ESVIpOwp9CgpzdGF0aWMgdm9pZCBiaXRfdmlhX3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCnsKCW91dGIoc3RhdGUgPyBpbmIoSTJDX0RJUikgJiB+STJDX1NEQSA6IGluYihJMkNfRElSKSB8IEkyQ19TREEsIEkyQ19ESVIpOwp9CgpzdGF0aWMgaW50IGJpdF92aWFfZ2V0c2NsKHZvaWQgKmRhdGEpCnsKCXJldHVybiAoMCAhPSAoaW5iKEkyQ19JTikgJiBJMkNfU0NMKSk7Cn0KCnN0YXRpYyBpbnQgYml0X3ZpYV9nZXRzZGEodm9pZCAqZGF0YSkKewoJcmV0dXJuICgwICE9IChpbmIoSTJDX0lOKSAmIEkyQ19TREEpKTsKfQoKCnN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgYml0X2RhdGEgPSB7Cgkuc2V0c2RhCQk9IGJpdF92aWFfc2V0c2RhLAoJLnNldHNjbAkJPSBiaXRfdmlhX3NldHNjbCwKCS5nZXRzZGEJCT0gYml0X3ZpYV9nZXRzZGEsCgkuZ2V0c2NsCQk9IGJpdF92aWFfZ2V0c2NsLAoJLnVkZWxheQkJPSA1LAoJLm1kZWxheQkJPSA1LAoJLnRpbWVvdXQJPSBIWgp9OwoKc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciB2dDU4NmJfYWRhcHRlciA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5jbGFzcyAgICAgICAgICA9IEkyQ19DTEFTU19IV01PTiwKCS5uYW1lCQk9ICJWSUEgaTJjIiwKCS5hbGdvX2RhdGEJPSAmYml0X2RhdGEsCn07CgoKc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZ0NTg2Yl9pZHNbXSBfX2RldmluaXRkYXRhID0gewoJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMykgfSwKCXsgMCwgfQp9OwoKTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCB2dDU4NmJfaWRzKTsKCnN0YXRpYyBpbnQgX19kZXZpbml0IHZ0NTg2Yl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCnsKCXUxNiBiYXNlOwoJdTggcmV2OwoJaW50IHJlczsKCglpZiAocG1faW9fYmFzZSkgewoJCWRldl9lcnIoJmRldi0+ZGV2LCAiaTJjLXZpYTogV2lsbCBvbmx5IHN1cHBvcnQgb25lIGhvc3RcbiIpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUE1fQ0ZHX1JFVklELCAmcmV2KTsKCglzd2l0Y2ggKHJldikgewoJY2FzZSAweDAwOgoJCWJhc2UgPSBQTV9DRkdfSU9CQVNFMDsKCQlicmVhazsKCWNhc2UgMHgwMToKCWNhc2UgMHgxMDoKCQliYXNlID0gUE1fQ0ZHX0lPQkFTRTE7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQliYXNlID0gUE1fQ0ZHX0lPQkFTRTE7CgkJLyogbGF0ZXIgcmV2aXNpb24gKi8KCX0KCglwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIGJhc2UsICZwbV9pb19iYXNlKTsKCXBtX2lvX2Jhc2UgJj0gKDB4ZmYgPDwgOCk7CgoJaWYgKCFyZXF1ZXN0X3JlZ2lvbihJMkNfRElSLCBJT1NQQUNFLCBJT1RFWFQpKSB7CgkJZGV2X2VycigmZGV2LT5kZXYsICJJTyAweCV4LTB4JXggYWxyZWFkeSBpbiB1c2VcbiIsIEkyQ19ESVIsIEkyQ19ESVIgKyBJT1NQQUNFKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglvdXRiKGluYihJMkNfRElSKSAmIH4oSTJDX1NEQSB8IEkyQ19TQ0wpLCBJMkNfRElSKTsKCW91dGIoaW5iKEkyQ19PVVQpICYgfihJMkNfU0RBIHwgSTJDX1NDTCksIEkyQ19PVVQpOwoKCS8qIHNldCB1cCB0aGUgZHJpdmVyZnMgbGlua2FnZSB0byBvdXIgcGFyZW50IGRldmljZSAqLwoJdnQ1ODZiX2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKCglyZXMgPSBpMmNfYml0X2FkZF9idXMoJnZ0NTg2Yl9hZGFwdGVyKTsKCWlmICggcmVzIDwgMCApIHsKCQlyZWxlYXNlX3JlZ2lvbihJMkNfRElSLCBJT1NQQUNFKTsKCQlwbV9pb19iYXNlID0gMDsKCQlyZXR1cm4gcmVzOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2dDU4NmJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCnsKCWkyY19iaXRfZGVsX2J1cygmdnQ1ODZiX2FkYXB0ZXIpOwoJcmVsZWFzZV9yZWdpb24oSTJDX0RJUiwgSU9TUEFDRSk7CglwbV9pb19iYXNlID0gMDsKfQoKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2dDU4NmJfZHJpdmVyID0gewoJLm5hbWUJCT0gInZ0NTg2Yl9zbWJ1cyIsCgkuaWRfdGFibGUJPSB2dDU4NmJfaWRzLAoJLnByb2JlCQk9IHZ0NTg2Yl9wcm9iZSwKCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodnQ1ODZiX3JlbW92ZSksCn07CgpzdGF0aWMgaW50IF9faW5pdCBpMmNfdnQ1ODZiX2luaXQodm9pZCkKewoJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZ0NTg2Yl9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgaTJjX3Z0NTg2Yl9leGl0KHZvaWQpCnsKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdnQ1ODZiX2RyaXZlcik7Cn0KCgpNT0RVTEVfQVVUSE9SKCJLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJpMmMgZm9yIFZpYSB2dDgyYzU4NmIgc291dGhicmlkZ2UiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX2luaXQoaTJjX3Z0NTg2Yl9pbml0KTsKbW9kdWxlX2V4aXQoaTJjX3Z0NTg2Yl9leGl0KTsK