LyoKICogTW9kaWZpZWQgaW4gb3JkZXIgdG8ga2VlcCBpdCBjb21wYXRpYmxlIGJvdGggd2l0aCBuZXcgYW5kIG9sZCB2aWRlb3RleHQgSU9DVExzIGJ5CiAqIE1pY2hhZWwgR2VuZyA8bGludXhATWljaGFlbEdlbmcuZGU+CiAqCiAqCUNsZWFuZWQgdXAgdG8gdXNlIGV4aXN0aW5nIHZpZGVvZGV2IGludGVyZmFjZSBhbmQgYWxsb3cgdGhlIGlkZWEKICoJb2YgbXVsdGlwbGUgdGVsZXRleHQgZGVjb2RlcnMgb24gdGhlIHZpZGVvNGxpbnV4IGlmYWNlLiBDaGFuZ2VkIGkyYwogKgl0byBjb3ZlciBhZGRyZXNzaW5nIGNsYXNoZXMgb24gZGV2aWNlIGJ1c3Nlcy4gSXQncyBhbHNvIHJlYnVpbHQgc28KICoJeW91IGNhbiBhZGQgYXJiaXRhcnkgbXVsdGlwbGUgdGVsZXRleHQgZGV2aWNlcyB0byBMaW51eCB2aWRlbzRsaW51eAogKglub3cgKHdlbGwgMzIgYW55d2F5KS4KICoKICoJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICoKICoJVGhlIG9yaWdpbmFsIGRyaXZlciB3YXMgaGVhdmlseSBtb2RpZmllZCB0byBtYXRjaCB0aGUgaTJjIGludGVyZmFjZQogKglJdCB3YXMgdHJ1bmNhdGVkIHRvIHVzZSB0aGUgV2luVFYgYm9hcmRzLCB0b28uCiAqCiAqCUNvcHlyaWdodCAoYykgMTk5OCBSaWNoYXJkIEd1ZW50aGVyIDxyaWNoYXJkLmd1ZW50aGVyQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZT4KICoKICoJRGVyaXZlZCBGcm9tCiAqCiAqIHZ0eC5jOgogKiBUaGlzIGlzIGEgbG9hZGFibGUgY2hhcmFjdGVyLWRldmljZS1kcml2ZXIgZm9yIHZpZGVvdGV4dC1pbnRlcmZhY2VzCiAqIChha2EgdGVsZXRleHQpLiBQbGVhc2UgY2hlY2sgdGhlIE1ha2VmaWxlL1JFQURNRSBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZAogKiBpbnRlcmZhY2VzLgogKgogKiBDb3B5cmlnaHQgKGMpIDE5OTQtOTcgTWFydGluIEJ1Y2sgIDxtYXJ0aW4tMi5idWNrQHN0dWRlbnQudW5pLXVsbS5kZT4KICoKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCiAqIFVTQS4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3ZpZGVvdGV4dC5oPgojaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgojaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYuaD4KCk1PRFVMRV9BVVRIT1IoIk1pY2hhZWwgR2VuZyA8bGludXhATWljaGFlbEdlbmcuZGU+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiUGhpbGlwcyBTQUE1MjQ5IFRlbGV0ZXh0IGRlY29kZXIgZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCgojZGVmaW5lIFZUWF9WRVJfTUFKIDEKI2RlZmluZSBWVFhfVkVSX01JTiA4CgoKI2RlZmluZSBOVU1fREFVUyA0CiNkZWZpbmUgTlVNX0JVRlMgOAoKc3RhdGljIGNvbnN0IGludCBkaXNwX21vZGVzWzhdWzNdID0KewoJeyAweDQ2LCAweDAzLCAweDAzIH0sCS8qIERJU1BPRkYgKi8KCXsgMHg0NiwgMHhjYywgMHhjYyB9LAkvKiBESVNQTk9STSAqLwoJeyAweDQ0LCAweDBmLCAweDBmIH0sCS8qIERJU1BUUkFOUyAqLwoJeyAweDQ2LCAweGNjLCAweDQ2IH0sCS8qIERJU1BJTlMgKi8KCXsgMHg0NCwgMHgwMywgMHgwMyB9LAkvKiBESVNQT0ZGLCBpbnRlcmxhY2VkICovCgl7IDB4NDQsIDB4Y2MsIDB4Y2MgfSwJLyogRElTUE5PUk0sIGludGVybGFjZWQgKi8KCXsgMHg0NCwgMHgwZiwgMHgwZiB9LAkvKiBESVNQVFJBTlMsIGludGVybGFjZWQgKi8KCXsgMHg0NCwgMHhjYywgMHg0NiB9CS8qIERJU1BJTlMsIGludGVybGFjZWQgKi8KfTsKCgoKI2RlZmluZSBQQUdFX1dBSVQgICAgbXNlY3NfdG9famlmZmllcygzMDApCS8qIFRpbWUgYmV0d2VlbiByZXF1ZXN0aW5nIHBhZ2UgYW5kICovCgkJCQkJCS8qIGNoZWNraW5nIHN0YXR1cyBiaXRzICovCiNkZWZpbmUgUEdCVUZfRVhQSVJFIG1zZWNzX3RvX2ppZmZpZXMoMTUwMDApCS8qIFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cmFuc21pdHRpbmcgKi8KCQkJCQkJLyogcGFnZSByZWdhcmRsZXNzIG9mIGluZm9iaXRzICovCnR5cGVkZWYgc3RydWN0IHsKCXU4IHBnYnVmW1ZUWF9WSVJUVUFMU0laRV07CQkvKiBQYWdlLWJ1ZmZlciAqLwoJdTggbGFzdHN0YXRbMTBdOwkJCS8qIExhc3QgdmFsdWUgb2YgaW5mb2JpdHMgZm9yIERBVSAqLwoJdTggc3JlZ3NbN107CQkJCS8qIFBhZ2UtcmVxdWVzdCByZWdpc3RlcnMgKi8KCXVuc2lnbmVkIGxvbmcgZXhwaXJlOwkJCS8qIFRpbWUgd2hlbiBwYWdlIHdpbGwgYmUgZXhwaXJlZCAqLwoJdW5zaWduZWQgY2xyZm91bmQgOiAxOwkJCS8qIFZUWElPQ0NMUkZPVU5EIGhhcyBiZWVuIGNhbGxlZCAqLwoJdW5zaWduZWQgc3RvcHBlZCA6IDE7CQkJLyogVlRYSU9DU1RPUERBVSBoYXMgYmVlbiBjYWxsZWQgKi8KfSB2ZGF1X3Q7CgpzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UKewoJc3RydWN0IHY0bDJfc3ViZGV2IHNkOwoJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKCXZkYXVfdCB2ZGF1W05VTV9EQVVTXTsJCQkvKiBEYXRhIGZvciB2aXJ0dWFsIERBVXMgKHRoZSA1MjQ5IG9ubHkgaGFzIG9uZSAqLwoJCQkJCQkvKiByZWFsIERBVSwgc28gd2UgaGF2ZSB0byBzaW11bGF0ZSBzb21lIG1vcmUpICovCglpbnQgdnR4X3VzZV9jb3VudDsKCWludCBpc19zZWFyY2hpbmdbTlVNX0RBVVNdOwoJaW50IGRpc3BfbW9kZTsKCWludCB2aXJ0dWFsX21vZGU7Cgl1bnNpZ25lZCBsb25nIGluX3VzZTsKCXN0cnVjdCBtdXRleCBsb2NrOwp9OwoKc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnRvX2RldihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQp7CglyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UsIHNkKTsKfQoKCiNkZWZpbmUgQ0NUV1IgMzQJCS8qIEmyQyB3cml0ZS9yZWFkLWFkZHJlc3Mgb2YgdnR4LWNoaXAgKi8KI2RlZmluZSBDQ1RSRCAzNQojZGVmaW5lIE5PQUNLX1JFUEVBVCAxMAkJLyogUmV0cnkgYWNjZXNzIHRoaXMgbWFueSB0aW1lcyBvbiBmYWlsdXJlICovCiNkZWZpbmUgQ0xFQVJfREVMQVkgICBtc2Vjc190b19qaWZmaWVzKDUwKQkvKiBUaW1lIHJlcXVpcmVkIHRvIGNsZWFyIGEgcGFnZSAqLwojZGVmaW5lIFJFQURZX1RJTUVPVVQgbXNlY3NfdG9famlmZmllcygzMCkJLyogVGltZSB0byB3YWl0IGZvciByZWFkeSBzaWduYWwgb2YgSTJDLWJ1cyBpbnRlcmZhY2UgKi8KI2RlZmluZSBJTklUX0RFTEFZIDUwMAkJLyogVGltZSBpbiB1c2VjIHRvIHdhaXQgYXQgaW5pdGlhbGl6YXRpb24gb2YgQ0VBIGludGVyZmFjZSAqLwojZGVmaW5lIFNUQVJUX0RFTEFZIDEwCQkvKiBUaW1lIGluIHVzZWMgdG8gd2FpdCBiZWZvcmUgc3RhcnRpbmcgd3JpdGUtY3ljbGUgKENFQSkgKi8KCiNkZWZpbmUgVlRYX0RFVl9NSU5PUiAwCgpzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzYWFfdGVtcGxhdGU7CS8qIERlY2xhcmVkIG5lYXIgYm90dG9tICovCgovKgogKglXYWl0IHRoZSBnaXZlbiBudW1iZXIgb2YgamlmZmllcyAoMTBtcykuIFRoaXMgY2FsbHMgdGhlIHNjaGVkdWxlciwgc28gdGhlIGFjdHVhbAogKglkZWxheSBtYXkgYmUgbG9uZ2VyLgogKi8KCnN0YXRpYyB2b2lkIGpkZWxheSh1bnNpZ25lZCBsb25nIGRlbGF5KQp7CglzaWdzZXRfdCBvbGRibG9ja2VkID0gY3VycmVudC0+YmxvY2tlZDsKCglzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOwoJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Cgltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGRlbGF5KSk7CgoJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CgljdXJyZW50LT5ibG9ja2VkID0gb2xkYmxvY2tlZDsKCXJlY2FsY19zaWdwZW5kaW5nKCk7CglzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwp9CgoKLyoKICoJSTJDIGludGVyZmFjZXMKICovCgpzdGF0aWMgaW50IGkyY19zZW5kYnVmKHN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCwgaW50IHJlZywgaW50IGNvdW50LCB1OCAqZGF0YSkKewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnQtPnNkKTsKCWNoYXIgYnVmWzY0XTsKCglidWZbMF0gPSByZWc7CgltZW1jcHkoYnVmKzEsIGRhdGEsIGNvdW50KTsKCglpZiAoaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCBjb3VudCArIDEpID09IGNvdW50ICsgMSkKCQlyZXR1cm4gMDsKCXJldHVybiAtMTsKfQoKc3RhdGljIGludCBpMmNfc2VuZGRhdGEoc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0LCAuLi4pCnsKCXVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKCWludCB2OwoJaW50IGN0ID0gMDsKCXZhX2xpc3QgYXJncDsKCXZhX3N0YXJ0KGFyZ3AsdCk7CgoJd2hpbGUgKCh2ID0gdmFfYXJnKGFyZ3AsIGludCkpICE9IC0xKQoJCWJ1ZltjdCsrXSA9IHY7CgoJdmFfZW5kKGFyZ3ApOwoJcmV0dXJuIGkyY19zZW5kYnVmKHQsIGJ1ZlswXSwgY3QtMSwgYnVmKzEpOwp9CgovKiBHZXQgY291bnQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gScKyQy1kZXZpY2UgYXQgYWRkcmVzcyBhZHIsIHN0b3JlIHRoZW0gaW4gYnVmLiBTdGFydCAmIHN0b3AKICogaGFuZHNoYWtpbmcgaXMgZG9uZSBieSB0aGlzIHJvdXRpbmUsIGFjayB3aWxsIGJlIHNlbnQgYWZ0ZXIgdGhlIGxhc3QgYnl0ZSB0byBpbmhpYml0IGZ1cnRoZXIKICogc2VuZGluZyBvZiBkYXRhLiBJZiB1YWNjZXNzIGlzICd0cnVlJywgZGF0YSBpcyB3cml0dGVuIHRvIHVzZXItc3BhY2Ugd2l0aCBwdXRfdXNlci4KICogUmV0dXJucyAtMSBpZiBJwrJDLWRldmljZSBkaWRuJ3Qgc2VuZCBhY2tub3dsZWRnZSwgMCBvdGhlcndpc2UKICovCgpzdGF0aWMgaW50IGkyY19nZXRkYXRhKHN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCwgaW50IGNvdW50LCB1OCAqYnVmKQp7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmdC0+c2QpOwoKCWlmIChpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBidWYsIGNvdW50KSAhPSBjb3VudCkKCQlyZXR1cm4gLTE7CglyZXR1cm4gMDsKfQoKCi8qCiAqCVN0YW5kYXJkIGNoYXJhY3Rlci1kZXZpY2UtZHJpdmVyIGZ1bmN0aW9ucwogKi8KCnN0YXRpYyBsb25nIGRvX3NhYTUyNDlfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKewoJc3RhdGljIGludCB2aXJ0dWFsX21vZGUgPSBmYWxzZTsKCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CgoJc3dpdGNoIChjbWQpIHsKCWNhc2UgVlRYSU9DR0VUSU5GTzoKCXsKCQl2dHhfaW5mb190ICppbmZvID0gYXJnOwoJCWluZm8tPnZlcnNpb25fbWFqb3IgPSBWVFhfVkVSX01BSjsKCQlpbmZvLT52ZXJzaW9uX21pbm9yID0gVlRYX1ZFUl9NSU47CgkJaW5mby0+bnVtcGFnZXMgPSBOVU1fREFVUzsKCQkvKmluZm8tPmNjdF90eXBlID0gQ0NUX1RZUEU7Ki8KCQlyZXR1cm4gMDsKCX0KCgljYXNlIFZUWElPQ0NMUlBBR0U6Cgl7CgkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOwoKCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKCQkJcmV0dXJuIC1FSU5WQUw7CgkJbWVtc2V0KHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYsICcgJywgc2l6ZW9mKHQtPnZkYXVbMF0ucGdidWYpKTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLmNscmZvdW5kID0gdHJ1ZTsKCQlyZXR1cm4gMDsKCX0KCgljYXNlIFZUWElPQ0NMUkZPVU5EOgoJewoJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKCgkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCgkJCXJldHVybiAtRUlOVkFMOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQgPSB0cnVlOwoJCXJldHVybiAwOwoJfQoKCWNhc2UgVlRYSU9DUEFHRVJFUToKCXsKCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CgkJaWYgKCEocmVxLT5wYWdlbWFzayAmIFBHTUFTS19QQUdFKSkKCQkJcmVxLT5wYWdlID0gMDsKCQlpZiAoIShyZXEtPnBhZ2VtYXNrICYgUEdNQVNLX0hPVVIpKQoJCQlyZXEtPmhvdXIgPSAwOwoJCWlmICghKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfTUlOVVRFKSkKCQkJcmVxLT5taW51dGUgPSAwOwoJCWlmIChyZXEtPnBhZ2UgPCAwIHx8IHJlcS0+cGFnZSA+IDB4OGZmKSAvKiA3RkYgPz8gKi8KCQkJcmV0dXJuIC1FSU5WQUw7CgkJcmVxLT5wYWdlICY9IDB4N2ZmOwoJCWlmIChyZXEtPmhvdXIgPCAwIHx8IHJlcS0+aG91ciA+IDB4M2YgfHwgcmVxLT5taW51dGUgPCAwIHx8IHJlcS0+bWludXRlID4gMHg3ZiB8fAoJCQlyZXEtPnBhZ2VtYXNrIDwgMCB8fCByZXEtPnBhZ2VtYXNrID49IFBHTUFTS19NQVggfHwgcmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKCQkJcmV0dXJuIC1FSU5WQUw7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1swXSA9IChyZXEtPnBhZ2VtYXNrICYgUEdfSFVORCA/IDB4MTAgOiAwKSB8IChyZXEtPnBhZ2UgLyAweDEwMCk7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1sxXSA9IChyZXEtPnBhZ2VtYXNrICYgUEdfVEVOID8gMHgxMCA6IDApIHwgKChyZXEtPnBhZ2UgLyAweDEwKSAmIDB4Zik7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1syXSA9IChyZXEtPnBhZ2VtYXNrICYgUEdfVU5JVCA/IDB4MTAgOiAwKSB8IChyZXEtPnBhZ2UgJiAweGYpOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbM10gPSAocmVxLT5wYWdlbWFzayAmIEhSX1RFTiA/IDB4MTAgOiAwKSB8IChyZXEtPmhvdXIgLyAweDEwKTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzRdID0gKHJlcS0+cGFnZW1hc2sgJiBIUl9VTklUID8gMHgxMCA6IDApIHwgKHJlcS0+aG91ciAmIDB4Zik7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1s1XSA9IChyZXEtPnBhZ2VtYXNrICYgTUlOX1RFTiA/IDB4MTAgOiAwKSB8IChyZXEtPm1pbnV0ZSAvIDB4MTApOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbNl0gPSAocmVxLT5wYWdlbWFzayAmIE1JTl9VTklUID8gMHgxMCA6IDApIHwgKHJlcS0+bWludXRlICYgMHhmKTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLnN0b3BwZWQgPSBmYWxzZTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLmNscmZvdW5kID0gdHJ1ZTsKCQl0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0gPSB0cnVlOwoJCXJldHVybiAwOwoJfQoKCWNhc2UgVlRYSU9DR0VUU1RBVDoKCXsKCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CgkJdTggaW5mb2JpdHNbMTBdOwoJCXZ0eF9wYWdlaW5mb190IGluZm87CgkJaW50IGE7CgoJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQlpZiAoIXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3RvcHBlZCkgewoJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDIsIDAsIC0xKSB8fAoJCQkJaTJjX3NlbmRidWYodCwgMywgc2l6ZW9mKHQtPnZkYXVbMF0uc3JlZ3MpLCB0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzKSB8fAoJCQkJaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDI1LCAwLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAtMSkgfHwKCQkJCWkyY19zZW5kZGF0YSh0LCAyLCAwLCB0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzBdIHwgOCwgLTEpIHx8CgkJCQlpMmNfc2VuZGRhdGEodCwgOCwgMCwgMjUsIDAsIC0xKSkKCQkJCXJldHVybiAtRUlPOwoJCQlqZGVsYXkoUEFHRV9XQUlUKTsKCQkJaWYgKGkyY19nZXRkYXRhKHQsIDEwLCBpbmZvYml0cykpCgkJCQlyZXR1cm4gLUVJTzsKCgkJCWlmICghKGluZm9iaXRzWzhdICYgMHgxMCkgJiYgIShpbmZvYml0c1s3XSAmIDB4ZjApICYmCS8qIGNoZWNrIEZPVU5ELWJpdCAqLwoJCQkJKG1lbWNtcChpbmZvYml0cywgdC0+dmRhdVtyZXEtPnBnYnVmXS5sYXN0c3RhdCwgc2l6ZW9mKGluZm9iaXRzKSkgfHwKCQkJCXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdC0+dmRhdVtyZXEtPnBnYnVmXS5leHBpcmUpKSkKCQkJewkJLyogY2hlY2sgaWYgbmV3IHBhZ2UgYXJyaXZlZCAqLwoJCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAwLCAwLCAtMSkgfHwKCQkJCQlpMmNfZ2V0ZGF0YSh0LCBWVFhfUEFHRVNJWkUsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYpKQoJCQkJCXJldHVybiAtRUlPOwoJCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5leHBpcmUgPSBqaWZmaWVzICsgUEdCVUZfRVhQSVJFOwoJCQkJbWVtc2V0KHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUsICcgJywgVlRYX1ZJUlRVQUxTSVpFIC0gVlRYX1BBR0VTSVpFKTsKCQkJCWlmICh0LT52aXJ0dWFsX21vZGUpIHsKCQkJCQkvKiBQYWNrZXQgWC8yNCAqLwoJCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMHgyMCwgMCwgLTEpIHx8CgkJCQkJCWkyY19nZXRkYXRhKHQsIDQwLCB0LT52ZGF1W3JlcS0+cGdidWZdLnBnYnVmICsgVlRYX1BBR0VTSVpFICsgMjAgKiA0MCkpCgkJCQkJCXJldHVybiAtRUlPOwoJCQkJCS8qIFBhY2tldCBYLzI3LzAgKi8KCQkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDB4MjEsIDAsIC0xKSB8fAoJCQkJCQlpMmNfZ2V0ZGF0YSh0LCA0MCwgdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiArIFZUWF9QQUdFU0laRSArIDE2ICogNDApKQoJCQkJCQlyZXR1cm4gLUVJTzsKCQkJCQkvKiBQYWNrZXQgOC8zMC8wLi4uOC8zMC8xNQoJCQkJCSAqIEZJWE1FOiBBRkFJSywgdGhlIDUyNDkgZG9lcyBoYW1taW5nLWRlY29kaW5nIGZvciBzb21lIGJ5dGVzIGluIHBhY2tldCA4LzMwLAoJCQkJCSAqICAgICAgICBzbyB3ZSBzaG91bGQgdW5kbyB0aGlzIGhlcmUuCgkJCQkJICovCgkJCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAweDIyLCAwLCAtMSkgfHwKCQkJCQkJaTJjX2dldGRhdGEodCwgNDAsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUgKyAyMyAqIDQwKSkKCQkJCQkJcmV0dXJuIC1FSU87CgkJCQl9CgkJCQl0LT52ZGF1W3JlcS0+cGdidWZdLmNscmZvdW5kID0gZmFsc2U7CgkJCQltZW1jcHkodC0+dmRhdVtyZXEtPnBnYnVmXS5sYXN0c3RhdCwgaW5mb2JpdHMsIHNpemVvZihpbmZvYml0cykpOwoJCQl9IGVsc2UgewoJCQkJbWVtY3B5KGluZm9iaXRzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBzaXplb2YoaW5mb2JpdHMpKTsKCQkJfQoJCX0gZWxzZSB7CgkJCW1lbWNweShpbmZvYml0cywgdC0+dmRhdVtyZXEtPnBnYnVmXS5sYXN0c3RhdCwgc2l6ZW9mKGluZm9iaXRzKSk7CgkJfQoKCQlpbmZvLnBhZ2VudW0gPSAoKGluZm9iaXRzWzhdIDw8IDgpICYgMHg3MDApIHwgKChpbmZvYml0c1sxXSA8PCA0KSAmIDB4ZjApIHwgKGluZm9iaXRzWzBdICYgMHgwZik7CgkJaWYgKGluZm8ucGFnZW51bSA8IDB4MTAwKQoJCQlpbmZvLnBhZ2VudW0gKz0gMHg4MDA7CgkJaW5mby5ob3VyID0gKChpbmZvYml0c1s1XSA8PCA0KSAmIDB4MzApIHwgKGluZm9iaXRzWzRdICYgMHgwZik7CgkJaW5mby5taW51dGUgPSAoKGluZm9iaXRzWzNdIDw8IDQpICYgMHg3MCkgfCAoaW5mb2JpdHNbMl0gJiAweDBmKTsKCQlpbmZvLmNoYXJzZXQgPSAoKGluZm9iaXRzWzddID4+IDEpICYgNyk7CgkJaW5mby5kZWxldGUgPSAhIShpbmZvYml0c1szXSAmIDgpOwoJCWluZm8uaGVhZGxpbmUgPSAhIShpbmZvYml0c1s1XSAmIDQpOwoJCWluZm8uc3VidGl0bGUgPSAhIShpbmZvYml0c1s1XSAmIDgpOwoJCWluZm8uc3VwcF9oZWFkZXIgPSAhIShpbmZvYml0c1s2XSAmIDEpOwoJCWluZm8udXBkYXRlID0gISEoaW5mb2JpdHNbNl0gJiAyKTsKCQlpbmZvLmludGVyX3NlcSA9ICEhKGluZm9iaXRzWzZdICYgNCk7CgkJaW5mby5kaXNfZGlzcCA9ICEhKGluZm9iaXRzWzZdICYgOCk7CgkJaW5mby5zZXJpYWwgPSAhIShpbmZvYml0c1s3XSAmIDEpOwoJCWluZm8ubm90Zm91bmQgPSAhIShpbmZvYml0c1s4XSAmIDB4MTApOwoJCWluZm8ucGJsZiA9ICEhKGluZm9iaXRzWzldICYgMHgyMCk7CgkJaW5mby5oYW1taW5nID0gMDsKCQlmb3IgKGEgPSAwOyBhIDw9IDc7IGErKykgewoJCQlpZiAoaW5mb2JpdHNbYV0gJiAweGYwKSB7CgkJCQlpbmZvLmhhbW1pbmcgPSAxOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJaWYgKHQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQpCgkJCWluZm8ubm90Zm91bmQgPSAxOwoJCWlmIChjb3B5X3RvX3VzZXIocmVxLT5idWZmZXIsICZpbmZvLCBzaXplb2YodnR4X3BhZ2VpbmZvX3QpKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJaWYgKCFpbmZvLmhhbW1pbmcgJiYgIWluZm8ubm90Zm91bmQpCgkJCXQtPmlzX3NlYXJjaGluZ1tyZXEtPnBnYnVmXSA9IGZhbHNlOwoJCXJldHVybiAwOwoJfQoKCWNhc2UgVlRYSU9DR0VUUEFHRToKCXsKCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CgkJaW50IHN0YXJ0LCBlbmQ7CgoJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTIHx8IHJlcS0+c3RhcnQgPCAwIHx8CgkJCXJlcS0+c3RhcnQgPiByZXEtPmVuZCB8fCByZXEtPmVuZCA+PSAodmlydHVhbF9tb2RlID8gVlRYX1ZJUlRVQUxTSVpFIDogVlRYX1BBR0VTSVpFKSkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJaWYgKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciwgJnQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWZbcmVxLT5zdGFydF0sIHJlcS0+ZW5kIC0gcmVxLT5zdGFydCArIDEpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCgkJIC8qCgkJICAqCUFsd2F5cyByZWFkIHRoZSB0aW1lIGRpcmVjdGx5IGZyb20gU0FBNTI0OQoJCSAgKi8KCgkJaWYgKHJlcS0+c3RhcnQgPD0gMzkgJiYgcmVxLT5lbmQgPj0gMzIpIHsKCQkJaW50IGxlbjsKCQkJY2hhciBidWZbMTZdOwoJCQlzdGFydCA9IG1heChyZXEtPnN0YXJ0LCAzMik7CgkJCWVuZCA9IG1pbihyZXEtPmVuZCwgMzkpOwoJCQlsZW4gPSBlbmQgLSBzdGFydCArIDE7CgkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMCwgc3RhcnQsIC0xKSB8fAoJCQkJaTJjX2dldGRhdGEodCwgbGVuLCBidWYpKQoJCQkJcmV0dXJuIC1FSU87CgkJCWlmIChjb3B5X3RvX3VzZXIocmVxLT5idWZmZXIgKyBzdGFydCAtIHJlcS0+c3RhcnQsIGJ1ZiwgbGVuKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCX0KCQkvKiBJbnNlcnQgdGhlIGN1cnJlbnQgaGVhZGVyIGlmIERBVSBpcyBzdGlsbCBzZWFyY2hpbmcgZm9yIGEgcGFnZSAqLwoJCWlmIChyZXEtPnN0YXJ0IDw9IDMxICYmIHJlcS0+ZW5kID49IDcgJiYgdC0+aXNfc2VhcmNoaW5nW3JlcS0+cGdidWZdKSB7CgkJCWNoYXIgYnVmWzMyXTsKCQkJaW50IGxlbjsKCgkJCXN0YXJ0ID0gbWF4KHJlcS0+c3RhcnQsIDcpOwoJCQllbmQgPSBtaW4ocmVxLT5lbmQsIDMxKTsKCQkJbGVuID0gZW5kIC0gc3RhcnQgKyAxOwoJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDAsIHN0YXJ0LCAtMSkgfHwKCQkJCWkyY19nZXRkYXRhKHQsIGxlbiwgYnVmKSkKCQkJCXJldHVybiAtRUlPOwoJCQlpZiAoY29weV90b191c2VyKHJlcS0+YnVmZmVyICsgc3RhcnQgLSByZXEtPnN0YXJ0LCBidWYsIGxlbikpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQl9CgkJcmV0dXJuIDA7Cgl9CgoJY2FzZSBWVFhJT0NTVE9QREFVOgoJewoJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKCgkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCgkJCXJldHVybiAtRUlOVkFMOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3RvcHBlZCA9IHRydWU7CgkJdC0+aXNfc2VhcmNoaW5nW3JlcS0+cGdidWZdID0gZmFsc2U7CgkJcmV0dXJuIDA7Cgl9CgoJY2FzZSBWVFhJT0NQVVRQQUdFOgoJY2FzZSBWVFhJT0NTRVRESVNQOgoJY2FzZSBWVFhJT0NQVVRTVEFUOgoJCXJldHVybiAwOwoKCWNhc2UgVlRYSU9DQ0xSQ0FDSEU6Cgl7CgkJaWYgKGkyY19zZW5kZGF0YSh0LCAwLCBOVU1fREFVUywgMCwgOCwgLTEpIHx8IGkyY19zZW5kZGF0YSh0LCAxMSwKCQkJJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywKCQkJJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywKCQkJJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywKCQkJJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywKCQkJLTEpKQoJCQlyZXR1cm4gLUVJTzsKCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDMsIDB4MjAsIC0xKSkKCQkJcmV0dXJuIC1FSU87CgkJamRlbGF5KDEwICogQ0xFQVJfREVMQVkpOwkJCS8qIEkgaGF2ZSBubyBpZGVhIGhvdyBsb25nIHdlIGhhdmUgdG8gd2FpdCBoZXJlICovCgkJcmV0dXJuIDA7Cgl9CgoJY2FzZSBWVFhJT0NTRVRWSVJUOgoJewoJCS8qIFRoZSBTQUE1MjQ5IGhhcyB2aXJ0dWFsLXJvdyByZWNlcHRpb24gdHVybmVkIG9uIGFsd2F5cyAqLwoJCXQtPnZpcnR1YWxfbW9kZSA9IChpbnQpKGxvbmcpYXJnOwoJCXJldHVybiAwOwoJfQoJfQoJcmV0dXJuIC1FSU5WQUw7Cn0KCi8qCiAqIFRyYW5zbGF0ZXMgb2xkIHZ0eCBJT0NUTHMgdG8gbmV3IG9uZXMKICoKICogVGhpcyBrZWVwcyBuZXcga2VybmVsIHZlcnNpb25zIGNvbXBhdGlibGUgd2l0aCBvbGQgdXNlcnNwYWNlIHByb2dyYW1zLgogKi8Kc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdnR4X2ZpeF9jb21tYW5kKHVuc2lnbmVkIGludCBjbWQpCnsKCXN3aXRjaCAoY21kKSB7CgljYXNlIFZUWElPQ0dFVElORk9fT0xEOgoJCWNtZCA9IFZUWElPQ0dFVElORk87CgkJYnJlYWs7CgljYXNlIFZUWElPQ0NMUlBBR0VfT0xEOgoJCWNtZCA9IFZUWElPQ0NMUlBBR0U7CgkJYnJlYWs7CgljYXNlIFZUWElPQ0NMUkZPVU5EX09MRDoKCQljbWQgPSBWVFhJT0NDTFJGT1VORDsKCQlicmVhazsKCWNhc2UgVlRYSU9DUEFHRVJFUV9PTEQ6CgkJY21kID0gVlRYSU9DUEFHRVJFUTsKCQlicmVhazsKCWNhc2UgVlRYSU9DR0VUU1RBVF9PTEQ6CgkJY21kID0gVlRYSU9DR0VUU1RBVDsKCQlicmVhazsKCWNhc2UgVlRYSU9DR0VUUEFHRV9PTEQ6CgkJY21kID0gVlRYSU9DR0VUUEFHRTsKCQlicmVhazsKCWNhc2UgVlRYSU9DU1RPUERBVV9PTEQ6CgkJY21kID0gVlRYSU9DU1RPUERBVTsKCQlicmVhazsKCWNhc2UgVlRYSU9DUFVUUEFHRV9PTEQ6CgkJY21kID0gVlRYSU9DUFVUUEFHRTsKCQlicmVhazsKCWNhc2UgVlRYSU9DU0VURElTUF9PTEQ6CgkJY21kID0gVlRYSU9DU0VURElTUDsKCQlicmVhazsKCWNhc2UgVlRYSU9DUFVUU1RBVF9PTEQ6CgkJY21kID0gVlRYSU9DUFVUU1RBVDsKCQlicmVhazsKCWNhc2UgVlRYSU9DQ0xSQ0FDSEVfT0xEOgoJCWNtZCA9IFZUWElPQ0NMUkNBQ0hFOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NTRVRWSVJUX09MRDoKCQljbWQgPSBWVFhJT0NTRVRWSVJUOwoJCWJyZWFrOwoJfQoJcmV0dXJuIGNtZDsKfQoKLyoKICoJSGFuZGxlIHRoZSBsb2NraW5nCiAqLwoKc3RhdGljIGxvbmcgc2FhNTI0OV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwoJbG9uZyBlcnI7CgoJY21kID0gdnR4X2ZpeF9jb21tYW5kKGNtZCk7CgltdXRleF9sb2NrKCZ0LT5sb2NrKTsKCWVyciA9IHZpZGVvX3VzZXJjb3B5KGZpbGUsIGNtZCwgYXJnLCBkb19zYWE1MjQ5X2lvY3RsKTsKCW11dGV4X3VubG9jaygmdC0+bG9jayk7CglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgaW50IHNhYTUyNDlfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKCWludCBwZ2J1ZjsKCglpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmdC0+aW5fdXNlKSkKCQlyZXR1cm4gLUVCVVNZOwoKCWlmIChpMmNfc2VuZGRhdGEodCwgMCwgMCwgLTEpIHx8IC8qIFNlbGVjdCBSMTEgKi8KCQkvKiBUdXJuIG9mZiBwYXJpdHkgY2hlY2tzICh3ZSBkbyB0aGlzIG91cnNlbHZlcykgKi8KCQlpMmNfc2VuZGRhdGEodCwgMSwgZGlzcF9tb2Rlc1t0LT5kaXNwX21vZGVdWzBdLCAwLCAtMSkgfHwKCQkvKiBEaXNwbGF5IFRWLXBpY3R1cmUsIG5vIHZpcnR1YWwgcm93cyAqLwoJCWkyY19zZW5kZGF0YSh0LCA0LCBOVU1fREFVUywgZGlzcF9tb2Rlc1t0LT5kaXNwX21vZGVdWzFdLCBkaXNwX21vZGVzW3QtPmRpc3BfbW9kZV1bMl0sIDcsIC0xKSkKCQkvKiBTZXQgZGlzcGxheSB0byBwYWdlIDQgKi8KCXsKCQljbGVhcl9iaXQoMCwgJnQtPmluX3VzZSk7CgkJcmV0dXJuIC1FSU87Cgl9CgoJZm9yIChwZ2J1ZiA9IDA7IHBnYnVmIDwgTlVNX0RBVVM7IHBnYnVmKyspIHsKCQltZW1zZXQodC0+dmRhdVtwZ2J1Zl0ucGdidWYsICcgJywgc2l6ZW9mKHQtPnZkYXVbMF0ucGdidWYpKTsKCQltZW1zZXQodC0+dmRhdVtwZ2J1Zl0uc3JlZ3MsIDAsIHNpemVvZih0LT52ZGF1WzBdLnNyZWdzKSk7CgkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLmxhc3RzdGF0LCAwLCBzaXplb2YodC0+dmRhdVswXS5sYXN0c3RhdCkpOwoJCXQtPnZkYXVbcGdidWZdLmV4cGlyZSA9IDA7CgkJdC0+dmRhdVtwZ2J1Zl0uY2xyZm91bmQgPSB0cnVlOwoJCXQtPnZkYXVbcGdidWZdLnN0b3BwZWQgPSB0cnVlOwoJCXQtPmlzX3NlYXJjaGluZ1twZ2J1Zl0gPSBmYWxzZTsKCX0KCXQtPnZpcnR1YWxfbW9kZSA9IGZhbHNlOwoJcmV0dXJuIDA7Cn0KCgoKc3RhdGljIGludCBzYWE1MjQ5X3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CgoJaTJjX3NlbmRkYXRhKHQsIDEsIDB4MjAsIC0xKTsJCS8qIFR1cm4gb2ZmIENDVCAqLwoJaTJjX3NlbmRkYXRhKHQsIDUsIDMsIDMsIC0xKTsJCS8qIFR1cm4gb2ZmIFRWLWRpc3BsYXkgKi8KCWNsZWFyX2JpdCgwLCAmdC0+aW5fdXNlKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHNhYV9mb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLm9wZW4JCT0gc2FhNTI0OV9vcGVuLAoJLnJlbGVhc2UgICAgICAgCT0gc2FhNTI0OV9yZWxlYXNlLAoJLmlvY3RsICAgICAgICAgID0gc2FhNTI0OV9pb2N0bCwKfTsKCnN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHNhYV90ZW1wbGF0ZSA9CnsKCS5uYW1lCQk9ICJzYWE1MjQ5IiwKCS5mb3BzICAgICAgICAgICA9ICZzYWFfZm9wcywKCS5yZWxlYXNlIAk9IHZpZGVvX2RldmljZV9yZWxlYXNlLAp9OwoKc3RhdGljIGludCBzYWE1MjQ5X2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqY2hpcCkKewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwoKCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGNoaXAsIFY0TDJfSURFTlRfU0FBNTI0OSwgMCk7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgc2FhNTI0OV9jb3JlX29wcyA9IHsKCS5nX2NoaXBfaWRlbnQgPSBzYWE1MjQ5X2dfY2hpcF9pZGVudCwKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHNhYTUyNDlfb3BzID0gewoJLmNvcmUgPSAmc2FhNTI0OV9jb3JlX29wcywKfTsKCnN0YXRpYyBpbnQgc2FhNTI0OV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAoJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCnsKCWludCBwZ2J1ZjsKCWludCBlcnI7CglzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQ7CglzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOwoKCXY0bF9pbmZvKGNsaWVudCwgImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsCgkJCWNsaWVudC0+YWRkciA8PCAxLCBjbGllbnQtPmFkYXB0ZXItPm5hbWUpOwoJdjRsX2luZm8oY2xpZW50LCAiVmlkZW9UZXh0IHZlcnNpb24gJWQuJWRcbiIsCgkJCVZUWF9WRVJfTUFKLCBWVFhfVkVSX01JTik7Cgl0ID0ga3phbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKTsKCWlmICh0ID09IE5VTEwpCgkJcmV0dXJuIC1FTk9NRU07CglzZCA9ICZ0LT5zZDsKCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZzYWE1MjQ5X29wcyk7CgltdXRleF9pbml0KCZ0LT5sb2NrKTsKCgkvKiBOb3cgY3JlYXRlIGEgdmlkZW80bGludXggZGV2aWNlICovCgl0LT52ZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CglpZiAodC0+dmRldiA9PSBOVUxMKSB7CgkJa2ZyZWUoY2xpZW50KTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCW1lbWNweSh0LT52ZGV2LCAmc2FhX3RlbXBsYXRlLCBzaXplb2YoKnQtPnZkZXYpKTsKCglmb3IgKHBnYnVmID0gMDsgcGdidWYgPCBOVU1fREFVUzsgcGdidWYrKykgewoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5wZ2J1ZiwgJyAnLCBzaXplb2YodC0+dmRhdVswXS5wZ2J1ZikpOwoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5zcmVncywgMCwgc2l6ZW9mKHQtPnZkYXVbMF0uc3JlZ3MpKTsKCQltZW1zZXQodC0+dmRhdVtwZ2J1Zl0ubGFzdHN0YXQsIDAsIHNpemVvZih0LT52ZGF1WzBdLmxhc3RzdGF0KSk7CgkJdC0+dmRhdVtwZ2J1Zl0uZXhwaXJlID0gMDsKCQl0LT52ZGF1W3BnYnVmXS5jbHJmb3VuZCA9IHRydWU7CgkJdC0+dmRhdVtwZ2J1Zl0uc3RvcHBlZCA9IHRydWU7CgkJdC0+aXNfc2VhcmNoaW5nW3BnYnVmXSA9IGZhbHNlOwoJfQoJdmlkZW9fc2V0X2RydmRhdGEodC0+dmRldiwgdCk7CgoJLyogUmVnaXN0ZXIgaXQgKi8KCWVyciA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSh0LT52ZGV2LCBWRkxfVFlQRV9WVFgsIC0xKTsKCWlmIChlcnIgPCAwKSB7CgkJa2ZyZWUodCk7CgkJdmlkZW9fZGV2aWNlX3JlbGVhc2UodC0+dmRldik7CgkJdC0+dmRldiA9IE5VTEw7CgkJcmV0dXJuIGVycjsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNhYTUyNDlfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCA9IHRvX2RldihzZCk7CgoJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UodC0+dmRldik7Cgl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CglrZnJlZSh0KTsKCXJldHVybiAwOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc2FhNTI0OV9pZFtdID0gewoJeyAic2FhNTI0OSIsIDAgfSwKCXsgfQp9OwpNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc2FhNTI0OV9pZCk7CgpzdGF0aWMgc3RydWN0IHY0bDJfaTJjX2RyaXZlcl9kYXRhIHY0bDJfaTJjX2RhdGEgPSB7CgkubmFtZSA9ICJzYWE1MjQ5IiwKCS5wcm9iZSA9IHNhYTUyNDlfcHJvYmUsCgkucmVtb3ZlID0gc2FhNTI0OV9yZW1vdmUsCgkuaWRfdGFibGUgPSBzYWE1MjQ5X2lkLAp9Owo=