LyoKICogU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2wgRGV2aWNlIGRyaXZlciBmb3IgVkFJTwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDUgTmFyYXlhbmFuIFIgUyA8bmFyc0BrYWRhbWJhLm9yZz4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgQWxj9HZlIDx3d3cuYWxjb3ZlLmNvbT4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxIE1pY2hhZWwgQXNobGV5IDxtLmFzaGxleUB1bnN3LmVkdS5hdT4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxIEp1bmljaGkgTW9yaXRhIDxqdW4xbUBtYXJzLmR0aS5uZS5qcD4KICoKICogQ29weXJpZ2h0IChDKSAyMDAwIFRha2F5YSBLaW5qbyA8dC1raW5qb0B0YzQuc28tbmV0Lm5lLmpwPgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDAgQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2VAdmFsaW51eC5jb20+CiAqCiAqIEVhcmxpZXIgd29yayBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIFBhdWwgYFJ1c3R5JyBSdXNzZWxsIGFuZCBQYXVsIE1hY2tlcnJhcy4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvd2FpdC5oPgojaW5jbHVkZSA8bGludXgvYWNwaS5oPgojaW5jbHVkZSA8bGludXgvZG1pLmg+CiNpbmNsdWRlIDxsaW51eC9lcnIuaD4KI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgoKI2luY2x1ZGUgPGxpbnV4L3NvbnlwaS5oPgoKI2RlZmluZSBTT05ZUElfRFJJVkVSX1ZFUlNJT04JICIxLjI2IgoKTU9EVUxFX0FVVEhPUigiU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbCBEZXZpY2UgZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX1ZFUlNJT04oU09OWVBJX0RSSVZFUl9WRVJTSU9OKTsKCnN0YXRpYyBpbnQgbWlub3IgPSAtMTsKbW9kdWxlX3BhcmFtKG1pbm9yLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG1pbm9yLAoJCSAibWlub3IgbnVtYmVyIG9mIHRoZSBtaXNjIGRldmljZSwgZGVmYXVsdCBpcyAtMSAoYXV0b21hdGljKSIpOwoKc3RhdGljIGludCB2ZXJib3NlOwkJLyogPSAwICovCm1vZHVsZV9wYXJhbSh2ZXJib3NlLCBpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJiZSB2ZXJib3NlLCBkZWZhdWx0IGlzIDAgKG5vKSIpOwoKc3RhdGljIGludCBmbmtleWluaXQ7CQkvKiA9IDAgKi8KbW9kdWxlX3BhcmFtKGZua2V5aW5pdCwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhmbmtleWluaXQsCgkJICJzZXQgdGhpcyBpZiB5b3VyIEZuIGtleXMgZG8gbm90IGdlbmVyYXRlIGFueSBldmVudCIpOwoKc3RhdGljIGludCBjYW1lcmE7CQkvKiA9IDAgKi8KbW9kdWxlX3BhcmFtKGNhbWVyYSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhjYW1lcmEsCgkJICJzZXQgdGhpcyBpZiB5b3UgaGF2ZSBhIE1vdGlvbkV5ZSBjYW1lcmEgKFBpY3R1cmVCb29rIHNlcmllcykiKTsKCnN0YXRpYyBpbnQgY29tcGF0OwkJLyogPSAwICovCm1vZHVsZV9wYXJhbShjb21wYXQsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoY29tcGF0LAoJCSAic2V0IHRoaXMgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZSIpOwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFzayA9IDB4ZmZmZmZmZmY7Cm1vZHVsZV9wYXJhbShtYXNrLCB1bG9uZywgMDY0NCk7Ck1PRFVMRV9QQVJNX0RFU0MobWFzaywKCQkgInNldCB0aGlzIHRvIHRoZSBtYXNrIG9mIGV2ZW50IHlvdSB3YW50IHRvIGVuYWJsZSAoc2VlIGRvYykiKTsKCnN0YXRpYyBpbnQgdXNlaW5wdXQgPSAxOwptb2R1bGVfcGFyYW0odXNlaW5wdXQsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0ModXNlaW5wdXQsCgkJICJzZXQgdGhpcyBpZiB5b3Ugd291bGQgbGlrZSBzb255cGkgdG8gZmVlZCBldmVudHMgdG8gdGhlIGlucHV0IHN1YnN5c3RlbSIpOwoKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxCTEKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyCTIKCi8qIHR5cGUxIG1vZGVscyB1c2UgdGhvc2UgKi8KI2RlZmluZSBTT05ZUElfSVJRX1BPUlQJCQkweDgwMzQKI2RlZmluZSBTT05ZUElfSVJRX1NISUZUCQkyMgojZGVmaW5lIFNPTllQSV9CQVNFCQkJMHg1MAojZGVmaW5lIFNPTllQSV9HMTBBCQkJKFNPTllQSV9CQVNFKzB4MTQpCiNkZWZpbmUgU09OWVBJX1RZUEUxX1JFR0lPTl9TSVpFCTB4MDgKI2RlZmluZSBTT05ZUElfVFlQRTFfRVZUWVBFX09GRlNFVAkweDA0CgovKiB0eXBlMiBzZXJpZXMgc3BlY2lmaWNzICovCiNkZWZpbmUgU09OWVBJX1NJUlEJCQkweDliCiNkZWZpbmUgU09OWVBJX1NMT0IJCQkweDljCiNkZWZpbmUgU09OWVBJX1NISUIJCQkweDlkCiNkZWZpbmUgU09OWVBJX1RZUEUyX1JFR0lPTl9TSVpFCTB4MjAKI2RlZmluZSBTT05ZUElfVFlQRTJfRVZUWVBFX09GRlNFVAkweDEyCgovKiBiYXR0ZXJ5IC8gYnJpZ2h0bmVzcyBhZGRyZXNzZXMgKi8KI2RlZmluZSBTT05ZUElfQkFUX0ZMQUdTCTB4ODEKI2RlZmluZSBTT05ZUElfTENEX0xJR0hUCTB4OTYKI2RlZmluZSBTT05ZUElfQkFUMV9QQ1RSTQkweGEwCiNkZWZpbmUgU09OWVBJX0JBVDFfTEVGVAkweGEyCiNkZWZpbmUgU09OWVBJX0JBVDFfTUFYUlQJMHhhNAojZGVmaW5lIFNPTllQSV9CQVQyX1BDVFJNCTB4YTgKI2RlZmluZSBTT05ZUElfQkFUMl9MRUZUCTB4YWEKI2RlZmluZSBTT05ZUElfQkFUMl9NQVhSVAkweGFjCiNkZWZpbmUgU09OWVBJX0JBVDFfTUFYVEsJMHhiMAojZGVmaW5lIFNPTllQSV9CQVQxX0ZVTEwJMHhiMgojZGVmaW5lIFNPTllQSV9CQVQyX01BWFRLCTB4YjgKI2RlZmluZSBTT05ZUElfQkFUMl9GVUxMCTB4YmEKCi8qIEZBTjAgaW5mb3JtYXRpb24gKHJldmVyc2UgZW5naW5lZXJlZCBmcm9tIEFDUEkgdGFibGVzKSAqLwojZGVmaW5lIFNPTllQSV9GQU4wX1NUQVRVUwkweDkzCiNkZWZpbmUgU09OWVBJX1RFTVBfU1RBVFVTCTB4QzEKCi8qIGlvcG9ydHMgdXNlZCBmb3IgYnJpZ2h0bmVzcyBhbmQgdHlwZTIgZXZlbnRzICovCiNkZWZpbmUgU09OWVBJX0RBVEFfSU9QT1JUCTB4NjIKI2RlZmluZSBTT05ZUElfQ1NUX0lPUE9SVAkweDY2CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGlvcG9ydHMgKi8Kc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCB7Cgl1MTYJcG9ydDE7Cgl1MTYJcG9ydDI7Cn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCBzb255cGlfdHlwZTFfaW9wb3J0X2xpc3RbXSA9IHsKCXsgMHgxMGMwLCAweDEwYzQgfSwJLyogbG9va3MgbGlrZSB0aGUgZGVmYXVsdCBvbiBDMVZ4ICovCgl7IDB4MTA4MCwgMHgxMDg0IH0sCgl7IDB4MTA5MCwgMHgxMDk0IH0sCgl7IDB4MTBhMCwgMHgxMGE0IH0sCgl7IDB4MTBiMCwgMHgxMGI0IH0sCgl7IDB4MCwgMHgwIH0KfTsKCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2lvcG9ydF9saXN0IHNvbnlwaV90eXBlMl9pb3BvcnRfbGlzdFtdID0gewoJeyAweDEwODAsIDB4MTA4NCB9LAoJeyAweDEwYTAsIDB4MTBhNCB9LAoJeyAweDEwYzAsIDB4MTBjNCB9LAoJeyAweDEwZTAsIDB4MTBlNCB9LAoJeyAweDAsIDB4MCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGludGVycnVwdHMgKi8Kc3RydWN0IHNvbnlwaV9pcnFfbGlzdCB7Cgl1MTYJaXJxOwoJdTE2CWJpdHM7Cn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9pcnFfbGlzdCBzb255cGlfdHlwZTFfaXJxX2xpc3RbXSA9IHsKCXsgMTEsIDB4MiB9LAkvKiBJUlEgMTEsIEdPMjI9MCxHTzIzPTEgaW4gQU1MICovCgl7IDEwLCAweDEgfSwJLyogSVJRIDEwLCBHTzIyPTEsR08yMz0wIGluIEFNTCAqLwoJeyAgNSwgMHgwIH0sCS8qIElSUSAgNSwgR08yMj0wLEdPMjM9MCBpbiBBTUwgKi8KCXsgIDAsIDB4MyB9CS8qIG5vIElSUSwgR08yMj0xLEdPMjM9MSBpbiBBTUwgKi8KfTsKCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2lycV9saXN0IHNvbnlwaV90eXBlMl9pcnFfbGlzdFtdID0gewoJeyAxMSwgMHg4MCB9LAkvKiBJUlEgMTEsIDB4ODAgaW4gU0lSUSBpbiBBTUwgKi8KCXsgMTAsIDB4NDAgfSwJLyogSVJRIDEwLCAweDQwIGluIFNJUlEgaW4gQU1MICovCgl7ICA5LCAweDIwIH0sCS8qIElSUSAgOSwgMHgyMCBpbiBTSVJRIGluIEFNTCAqLwoJeyAgNiwgMHgxMCB9LAkvKiBJUlEgIDYsIDB4MTAgaW4gU0lSUSBpbiBBTUwgKi8KCXsgIDAsIDB4MDAgfQkvKiBubyBJUlEsIDB4MDAgaW4gU0lSUSBpbiBBTUwgKi8KfTsKCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9CUklHSFRORVNTCQkwCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9DT05UUkFTVAkJCTEKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0hVRQkJCTIKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTE9SCQkJMwojZGVmaW5lIFNPTllQSV9DQU1FUkFfU0hBUlBORVNTCQkJNAoKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1BJQ1RVUkUJCQk1CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9FWFBPU1VSRV9NQVNLCQkweEMKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1dISVRFX0JBTEFOQ0VfTUFTSwkweDMKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1BJQ1RVUkVfTU9ERV9NQVNLCQkweDMwCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9NVVRFX01BU0sJCQkweDQwCgovKiB0aGUgcmVzdCBkb24ndCBuZWVkIGEgbG9vcCB1bnRpbCBub3QgMHhmZiAqLwojZGVmaW5lIFNPTllQSV9DQU1FUkFfQUdDCQkJNgojZGVmaW5lIFNPTllQSV9DQU1FUkFfQUdDX01BU0sJCQkweDMwCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSFVUVEVSX01BU0sgCQkweDcKCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSFVURE9XTl9SRVFVRVNUCQk3CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9DT05UUk9MCQkJMHgxMAoKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVUyAJCQk3CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9TVEFUVVNfUkVBRFkgCQkweDIKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVU19QT1NJVElPTgkJMHg0CgojZGVmaW5lIFNPTllQSV9ESVJFQ1RJT05fQkFDS1dBUkRTIAkJMHg0CgojZGVmaW5lIFNPTllQSV9DQU1FUkFfUkVWSVNJT04gCQkJOAojZGVmaW5lIFNPTllQSV9DQU1FUkFfUk9NVkVSU0lPTiAJCTkKCi8qIEV2ZW50IG1hc2tzICovCiNkZWZpbmUgU09OWVBJX0pPR0dFUl9NQVNLCQkJMHgwMDAwMDAwMQojZGVmaW5lIFNPTllQSV9DQVBUVVJFX01BU0sJCQkweDAwMDAwMDAyCiNkZWZpbmUgU09OWVBJX0ZOS0VZX01BU0sJCQkweDAwMDAwMDA0CiNkZWZpbmUgU09OWVBJX0JMVUVUT09USF9NQVNLCQkJMHgwMDAwMDAwOAojZGVmaW5lIFNPTllQSV9QS0VZX01BU0sJCQkweDAwMDAwMDEwCiNkZWZpbmUgU09OWVBJX0JBQ0tfTUFTSwkJCTB4MDAwMDAwMjAKI2RlZmluZSBTT05ZUElfSEVMUF9NQVNLCQkJMHgwMDAwMDA0MAojZGVmaW5lIFNPTllQSV9MSURfTUFTSwkJCQkweDAwMDAwMDgwCiNkZWZpbmUgU09OWVBJX1pPT01fTUFTSwkJCTB4MDAwMDAxMDAKI2RlZmluZSBTT05ZUElfVEhVTUJQSFJBU0VfTUFTSwkJCTB4MDAwMDAyMDAKI2RlZmluZSBTT05ZUElfTUVZRV9NQVNLCQkJMHgwMDAwMDQwMAojZGVmaW5lIFNPTllQSV9NRU1PUllTVElDS19NQVNLCQkJMHgwMDAwMDgwMAojZGVmaW5lIFNPTllQSV9CQVRURVJZX01BU0sJCQkweDAwMDAxMDAwCgpzdHJ1Y3Qgc29ueXBpX2V2ZW50IHsKCXU4CWRhdGE7Cgl1OAlldmVudDsKfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgYnV0dG9uIHJlbGVhc2UgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9yZWxlYXNlZXZbXSA9IHsKCXsgMHgwMCwgU09OWVBJX0VWRU5UX0FOWUJVVFRPTl9SRUxFQVNFRCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgam9nZ2VyIGV2ZW50cyAgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2pvZ2dlcmV2W10gPSB7Cgl7IDB4MWYsIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQIH0sCgl7IDB4MDEsIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV04gfSwKCXsgMHg1ZiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVBfUFJFU1NFRCB9LAoJeyAweDQxLCBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOX1BSRVNTRUQgfSwKCXsgMHgxZSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9VUCB9LAoJeyAweDAyLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX0RPV04gfSwKCXsgMHg1ZSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9VUF9QUkVTU0VEIH0sCgl7IDB4NDIsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTl9QUkVTU0VEIH0sCgl7IDB4MWQsIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX1VQIH0sCgl7IDB4MDMsIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV04gfSwKCXsgMHg1ZCwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVBfUFJFU1NFRCB9LAoJeyAweDQzLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9ET1dOX1BSRVNTRUQgfSwKCXsgMHg0MCwgU09OWVBJX0VWRU5UX0pPR0RJQUxfUFJFU1NFRCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgY2FwdHVyZSBidXR0b24gZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9jYXB0dXJlZXZbXSA9IHsKCXsgMHgwNSwgU09OWVBJX0VWRU5UX0NBUFRVUkVfUEFSVElBTFBSRVNTRUQgfSwKCXsgMHgwNywgU09OWVBJX0VWRU5UX0NBUFRVUkVfUFJFU1NFRCB9LAoJeyAweDAxLCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUkVMRUFTRUQgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGZua2V5cyBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2Zua2V5ZXZbXSA9IHsKCXsgMHgxMCwgU09OWVBJX0VWRU5UX0ZOS0VZX0VTQyB9LAoJeyAweDExLCBTT05ZUElfRVZFTlRfRk5LRVlfRjEgfSwKCXsgMHgxMiwgU09OWVBJX0VWRU5UX0ZOS0VZX0YyIH0sCgl7IDB4MTMsIFNPTllQSV9FVkVOVF9GTktFWV9GMyB9LAoJeyAweDE0LCBTT05ZUElfRVZFTlRfRk5LRVlfRjQgfSwKCXsgMHgxNSwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y1IH0sCgl7IDB4MTYsIFNPTllQSV9FVkVOVF9GTktFWV9GNiB9LAoJeyAweDE3LCBTT05ZUElfRVZFTlRfRk5LRVlfRjcgfSwKCXsgMHgxOCwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y4IH0sCgl7IDB4MTksIFNPTllQSV9FVkVOVF9GTktFWV9GOSB9LAoJeyAweDFhLCBTT05ZUElfRVZFTlRfRk5LRVlfRjEwIH0sCgl7IDB4MWIsIFNPTllQSV9FVkVOVF9GTktFWV9GMTEgfSwKCXsgMHgxYywgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMiB9LAoJeyAweDFmLCBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQgfSwKCXsgMHgyMSwgU09OWVBJX0VWRU5UX0ZOS0VZXzEgfSwKCXsgMHgyMiwgU09OWVBJX0VWRU5UX0ZOS0VZXzIgfSwKCXsgMHgzMSwgU09OWVBJX0VWRU5UX0ZOS0VZX0QgfSwKCXsgMHgzMiwgU09OWVBJX0VWRU5UX0ZOS0VZX0UgfSwKCXsgMHgzMywgU09OWVBJX0VWRU5UX0ZOS0VZX0YgfSwKCXsgMHgzNCwgU09OWVBJX0VWRU5UX0ZOS0VZX1MgfSwKCXsgMHgzNSwgU09OWVBJX0VWRU5UX0ZOS0VZX0IgfSwKCXsgMHgzNiwgU09OWVBJX0VWRU5UX0ZOS0VZX09OTFkgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIHByb2dyYW0ga2V5IGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfcGtleWV2W10gPSB7Cgl7IDB4MDEsIFNPTllQSV9FVkVOVF9QS0VZX1AxIH0sCgl7IDB4MDIsIFNPTllQSV9FVkVOVF9QS0VZX1AyIH0sCgl7IDB4MDQsIFNPTllQSV9FVkVOVF9QS0VZX1AzIH0sCgl7IDB4NWMsIFNPTllQSV9FVkVOVF9QS0VZX1AxIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBibHVldG9vdGggZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9ibHVlZXZbXSA9IHsKCXsgMHg1NSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9QUkVTU0VEIH0sCgl7IDB4NTksIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT04gfSwKCXsgMHg1YSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PRkYgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJhY2sgYnV0dG9uIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfYmFja2V2W10gPSB7Cgl7IDB4MjAsIFNPTllQSV9FVkVOVF9CQUNLX1BSRVNTRUQgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGhlbHAgYnV0dG9uIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfaGVscGV2W10gPSB7Cgl7IDB4M2IsIFNPTllQSV9FVkVOVF9IRUxQX1BSRVNTRUQgfSwKCXsgMCwgMCB9Cn07CgoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBsaWQgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9saWRldltdID0gewoJeyAweDUxLCBTT05ZUElfRVZFTlRfTElEX0NMT1NFRCB9LAoJeyAweDUwLCBTT05ZUElfRVZFTlRfTElEX09QRU5FRCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgem9vbSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3pvb21ldltdID0gewoJeyAweDM5LCBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSB0aHVtYnBocmFzZSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3RodW1icGhyYXNlZXZbXSA9IHsKCXsgMHgzYSwgU09OWVBJX0VWRU5UX1RIVU1CUEhSQVNFX1BSRVNTRUQgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIG1vdGlvbmV5ZSBjYW1lcmEgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9tZXllZXZbXSA9IHsKCXsgMHgwMCwgU09OWVBJX0VWRU5UX01FWUVfRkFDRSB9LAoJeyAweDAxLCBTT05ZUElfRVZFTlRfTUVZRV9PUFBPU0lURSB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgbWVtb3J5c3RpY2sgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9tZW1vcnlzdGlja2V2W10gPSB7Cgl7IDB4NTMsIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19JTlNFUlQgfSwKCXsgMHg1NCwgU09OWVBJX0VWRU5UX01FTU9SWVNUSUNLX0VKRUNUIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBiYXR0ZXJ5IGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfYmF0dGVyeWV2W10gPSB7Cgl7IDB4MjAsIFNPTllQSV9FVkVOVF9CQVRURVJZX0lOU0VSVCB9LAoJeyAweDMwLCBTT05ZUElfRVZFTlRfQkFUVEVSWV9SRU1PVkUgfSwKCXsgMCwgMCB9Cn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudHR5cGVzIHsKCWludAkJCW1vZGVsOwoJdTgJCQlkYXRhOwoJdW5zaWduZWQgbG9uZwkJbWFzazsKCXN0cnVjdCBzb255cGlfZXZlbnQgKglldmVudHM7Cn0gc29ueXBpX2V2ZW50dHlwZXNbXSA9IHsKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDcwLCBTT05ZUElfTUVZRV9NQVNLLCBzb255cGlfbWV5ZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MzAsIFNPTllQSV9MSURfTUFTSywgc29ueXBpX2xpZGV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4NjAsIFNPTllQSV9DQVBUVVJFX01BU0ssIHNvbnlwaV9jYXB0dXJlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHgxMCwgU09OWVBJX0pPR0dFUl9NQVNLLCBzb255cGlfam9nZ2VyZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHgyMCwgU09OWVBJX0ZOS0VZX01BU0ssIHNvbnlwaV9mbmtleWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MzAsIFNPTllQSV9CTFVFVE9PVEhfTUFTSywgc29ueXBpX2JsdWVldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDQwLCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MzAsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDQwLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCgoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MzgsIFNPTllQSV9MSURfTUFTSywgc29ueXBpX2xpZGV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MTEsIFNPTllQSV9KT0dHRVJfTUFTSywgc29ueXBpX2pvZ2dlcmV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4NjEsIFNPTllQSV9DQVBUVVJFX01BU0ssIHNvbnlwaV9jYXB0dXJlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMSwgU09OWVBJX0ZOS0VZX01BU0ssIHNvbnlwaV9mbmtleWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MzEsIFNPTllQSV9CTFVFVE9PVEhfTUFTSywgc29ueXBpX2JsdWVldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDA4LCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MTEsIFNPTllQSV9CQUNLX01BU0ssIHNvbnlwaV9iYWNrZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgwOCwgU09OWVBJX0hFTFBfTUFTSywgc29ueXBpX2hlbHBldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDIxLCBTT05ZUElfSEVMUF9NQVNLLCBzb255cGlfaGVscGV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MjEsIFNPTllQSV9aT09NX01BU0ssIHNvbnlwaV96b29tZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMCwgU09OWVBJX1RIVU1CUEhSQVNFX01BU0ssIHNvbnlwaV90aHVtYnBocmFzZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MzEsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDQxLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MzEsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKCgl7IDAgfQp9OwoKI2RlZmluZSBTT05ZUElfQlVGX1NJWkUJMTI4CgovKiBUaGUgbmFtZSBvZiB0aGUgZGV2aWNlcyBmb3IgdGhlIGlucHV0IGRldmljZSBkcml2ZXJzICovCiNkZWZpbmUgU09OWVBJX0pPR19JTlBVVE5BTUUJIlNvbnkgVmFpbyBKb2dkaWFsIgojZGVmaW5lIFNPTllQSV9LRVlfSU5QVVROQU1FCSJTb255IFZhaW8gS2V5cyIKCi8qIENvcnJlc3BvbmRhbmNlIHRhYmxlIGJldHdlZW4gc29ueXBpIGV2ZW50cyBhbmQgaW5wdXQgbGF5ZXIgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3QgewoJaW50IHNvbnlwaWV2OwoJaW50IGlucHV0ZXY7Cn0gc29ueXBpX2lucHV0a2V5c1tdID0gewoJeyBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VELAkgCUtFWV9DQU1FUkEgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX09OTFksIAkJS0VZX0ZOIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9FU0MsIAkJS0VZX0ZOX0VTQyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjEsIAkJS0VZX0ZOX0YxIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMiwgCQlLRVlfRk5fRjIgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YzLCAJCUtFWV9GTl9GMyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjQsIAkJS0VZX0ZOX0Y0IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GNSwgCQlLRVlfRk5fRjUgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2LCAJCUtFWV9GTl9GNiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjcsIAkJS0VZX0ZOX0Y3IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GOCwgCQlLRVlfRk5fRjggfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5LAkJS0VZX0ZOX0Y5IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMTAsCQlLRVlfRk5fRjEwIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMTEsIAkJS0VZX0ZOX0YxMSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjEyLAkJS0VZX0ZOX0YxMiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfMSwgCQlLRVlfRk5fMSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfMiwgCQlLRVlfRk5fMiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRCwJCQlLRVlfRk5fRCB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRSwJCQlLRVlfRk5fRSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRiwJCQlLRVlfRk5fRiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfUywJCQlLRVlfRk5fUyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfQiwJCQlLRVlfRk5fQiB9LAoJeyBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQsIAlLRVlfQkxVRSB9LAoJeyBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09OLCAJCUtFWV9CTFVFIH0sCgl7IFNPTllQSV9FVkVOVF9QS0VZX1AxLCAJCUtFWV9QUk9HMSB9LAoJeyBTT05ZUElfRVZFTlRfUEtFWV9QMiwgCQlLRVlfUFJPRzIgfSwKCXsgU09OWVBJX0VWRU5UX1BLRVlfUDMsIAkJS0VZX1BST0czIH0sCgl7IFNPTllQSV9FVkVOVF9CQUNLX1BSRVNTRUQsIAkJS0VZX0JBQ0sgfSwKCXsgU09OWVBJX0VWRU5UX0hFTFBfUFJFU1NFRCwgCQlLRVlfSEVMUCB9LAoJeyBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VELCAJCUtFWV9aT09NIH0sCgl7IFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VELCAJQlROX1RIVU1CIH0sCgl7IDAsIDAgfSwKfTsKCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2RldmljZSB7CglzdHJ1Y3QgcGNpX2RldiAqZGV2OwoJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKCXUxNiBpcnE7Cgl1MTYgYml0czsKCXUxNiBpb3BvcnQxOwoJdTE2IGlvcG9ydDI7Cgl1MTYgcmVnaW9uX3NpemU7Cgl1MTYgZXZ0eXBlX29mZnNldDsKCWludCBjYW1lcmFfcG93ZXI7CglpbnQgYmx1ZXRvb3RoX3Bvd2VyOwoJc3RydWN0IHNlbWFwaG9yZSBsb2NrOwoJc3RydWN0IGtmaWZvICpmaWZvOwoJc3BpbmxvY2tfdCBmaWZvX2xvY2s7Cgl3YWl0X3F1ZXVlX2hlYWRfdCBmaWZvX3Byb2NfbGlzdDsKCXN0cnVjdCBmYXN5bmNfc3RydWN0ICpmaWZvX2FzeW5jOwoJaW50IG9wZW5fY291bnQ7CglpbnQgbW9kZWw7CglzdHJ1Y3QgaW5wdXRfZGV2IGlucHV0X2pvZ19kZXY7CglzdHJ1Y3QgaW5wdXRfZGV2IGlucHV0X2tleV9kZXY7CglzdHJ1Y3Qgd29ya19zdHJ1Y3QgaW5wdXRfd29yazsKCXN0cnVjdCBrZmlmbyAqaW5wdXRfZmlmbzsKCXNwaW5sb2NrX3QgaW5wdXRfZmlmb19sb2NrOwp9IHNvbnlwaV9kZXZpY2U7CgojZGVmaW5lIElURVJBVElPTlNfTE9ORwkJMTAwMDAKI2RlZmluZSBJVEVSQVRJT05TX1NIT1JUCTEwCgojZGVmaW5lIHdhaXRfb25fY29tbWFuZChxdWlldCwgY29tbWFuZCwgaXRlcmF0aW9ucykgeyBcCgl1bnNpZ25lZCBpbnQgbiA9IGl0ZXJhdGlvbnM7IFwKCXdoaWxlICgtLW4gJiYgKGNvbW1hbmQpKSBcCgkJdWRlbGF5KDEpOyBcCglpZiAoIW4gJiYgKHZlcmJvc2UgfHwgIXF1aWV0KSkgXAoJCXByaW50ayhLRVJOX1dBUk5JTkcgInNvbnlwaSBjb21tYW5kIGZhaWxlZCBhdCAlcyA6ICVzIChsaW5lICVkKVxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCn0KCiNpZmRlZiBDT05GSUdfQUNQSQojZGVmaW5lIFNPTllQSV9BQ1BJX0FDVElWRSAoIWFjcGlfZGlzYWJsZWQpCiNlbHNlCiNkZWZpbmUgU09OWVBJX0FDUElfQUNUSVZFIDAKI2VuZGlmCQkJCS8qIENPTkZJR19BQ1BJICovCgpzdGF0aWMgaW50IHNvbnlwaV9lY193cml0ZSh1OCBhZGRyLCB1OCB2YWx1ZSkKewojaWZkZWYgQ09ORklHX0FDUElfRUMKCWlmIChTT05ZUElfQUNQSV9BQ1RJVkUpCgkJcmV0dXJuIGVjX3dyaXRlKGFkZHIsIHZhbHVlKTsKI2VuZGlmCgl3YWl0X29uX2NvbW1hbmQoMSwgaW5iX3AoU09OWVBJX0NTVF9JT1BPUlQpICYgMywgSVRFUkFUSU9OU19MT05HKTsKCW91dGJfcCgweDgxLCBTT05ZUElfQ1NUX0lPUE9SVCk7Cgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3AoU09OWVBJX0NTVF9JT1BPUlQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGJfcChhZGRyLCBTT05ZUElfREFUQV9JT1BPUlQpOwoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiX3AodmFsdWUsIFNPTllQSV9EQVRBX0lPUE9SVCk7Cgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3AoU09OWVBJX0NTVF9JT1BPUlQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNvbnlwaV9lY19yZWFkKHU4IGFkZHIsIHU4ICp2YWx1ZSkKewojaWZkZWYgQ09ORklHX0FDUElfRUMKCWlmIChTT05ZUElfQUNQSV9BQ1RJVkUpCgkJcmV0dXJuIGVjX3JlYWQoYWRkciwgdmFsdWUpOwojZW5kaWYKCXdhaXRfb25fY29tbWFuZCgxLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAzLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yl9wKDB4ODAsIFNPTllQSV9DU1RfSU9QT1JUKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yl9wKGFkZHIsIFNPTllQSV9EQVRBX0lPUE9SVCk7Cgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3AoU09OWVBJX0NTVF9JT1BPUlQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCSp2YWx1ZSA9IGluYl9wKFNPTllQSV9EQVRBX0lPUE9SVCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBlY19yZWFkMTYodTggYWRkciwgdTE2ICp2YWx1ZSkKewoJdTggdmFsX2xiLCB2YWxfaGI7CglpZiAoc29ueXBpX2VjX3JlYWQoYWRkciwgJnZhbF9sYikpCgkJcmV0dXJuIC0xOwoJaWYgKHNvbnlwaV9lY19yZWFkKGFkZHIgKyAxLCAmdmFsX2hiKSkKCQlyZXR1cm4gLTE7CgkqdmFsdWUgPSB2YWxfbGIgfCAodmFsX2hiIDw8IDgpOwoJcmV0dXJuIDA7Cn0KCi8qIEluaXRpYWxpemVzIHRoZSBkZXZpY2UgLSB0aGlzIGNvbWVzIGZyb20gdGhlIEFNTCBjb2RlIGluIHRoZSBBQ1BJIGJpb3MgKi8Kc3RhdGljIHZvaWQgc29ueXBpX3R5cGUxX3Nycyh2b2lkKQp7Cgl1MzIgdjsKCglwY2lfcmVhZF9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCAmdik7Cgl2ID0gKHYgJiAweEZGRkYwMDAwKSB8ICgodTMyKSBzb255cGlfZGV2aWNlLmlvcG9ydDEpOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsIHYpOwoKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsICZ2KTsKCXYgPSAodiAmIDB4RkZGMEZGRkYpIHwKCSAgICAoKCh1MzIpIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSBeIHNvbnlwaV9kZXZpY2UuaW9wb3J0MikgPDwgMTYpOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsIHYpOwoKCXYgPSBpbmwoU09OWVBJX0lSUV9QT1JUKTsKCXYgJj0gfigoKHUzMikgMHgzKSA8PCBTT05ZUElfSVJRX1NISUZUKTsKCXYgfD0gKCgodTMyKSBzb255cGlfZGV2aWNlLmJpdHMpIDw8IFNPTllQSV9JUlFfU0hJRlQpOwoJb3V0bCh2LCBTT05ZUElfSVJRX1BPUlQpOwoKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsICZ2KTsKCXYgPSAodiAmIDB4RkYxRkZGRkYpIHwgMHgwMEMwMDAwMDsKCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCB2KTsKfQoKc3RhdGljIHZvaWQgc29ueXBpX3R5cGUyX3Nycyh2b2lkKQp7CglpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TSElCLCAoc29ueXBpX2RldmljZS5pb3BvcnQxICYgMHhGRjAwKSA+PiA4KSkKCQlwcmludGsoS0VSTl9XQVJOSU5HICJlY193cml0ZSBmYWlsZWRcbiIpOwoJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0xPQiwgc29ueXBpX2RldmljZS5pb3BvcnQxICYgMHgwMEZGKSkKCQlwcmludGsoS0VSTl9XQVJOSU5HICJlY193cml0ZSBmYWlsZWRcbiIpOwoJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0lSUSwgc29ueXBpX2RldmljZS5iaXRzKSkKCQlwcmludGsoS0VSTl9XQVJOSU5HICJlY193cml0ZSBmYWlsZWRcbiIpOwoJdWRlbGF5KDEwKTsKfQoKLyogRGlzYWJsZXMgdGhlIGRldmljZSAtIHRoaXMgY29tZXMgZnJvbSB0aGUgQU1MIGNvZGUgaW4gdGhlIEFDUEkgYmlvcyAqLwpzdGF0aWMgdm9pZCBzb255cGlfdHlwZTFfZGlzKHZvaWQpCnsKCXUzMiB2OwoKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsICZ2KTsKCXYgPSB2ICYgMHhGRjNGRkZGRjsKCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCB2KTsKCgl2ID0gaW5sKFNPTllQSV9JUlFfUE9SVCk7Cgl2IHw9ICgweDMgPDwgU09OWVBJX0lSUV9TSElGVCk7CglvdXRsKHYsIFNPTllQSV9JUlFfUE9SVCk7Cn0KCnN0YXRpYyB2b2lkIHNvbnlwaV90eXBlMl9kaXModm9pZCkKewoJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0hJQiwgMCkpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX1NMT0IsIDApKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7CglpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TSVJRLCAwKSkKCQlwcmludGsoS0VSTl9XQVJOSU5HICJlY193cml0ZSBmYWlsZWRcbiIpOwp9CgpzdGF0aWMgdTggc29ueXBpX2NhbGwxKHU4IGRldikKewoJdTggdjEsIHYyOwoKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZGV2LCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJdjEgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJdjIgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDEpOwoJcmV0dXJuIHYyOwp9CgpzdGF0aWMgdTggc29ueXBpX2NhbGwyKHU4IGRldiwgdTggZm4pCnsKCXU4IHYxOwoKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZGV2LCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MikgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yihmbiwgc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXYxID0gaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXJldHVybiB2MTsKfQoKc3RhdGljIHU4IHNvbnlwaV9jYWxsMyh1OCBkZXYsIHU4IGZuLCB1OCB2KQp7Cgl1OCB2MTsKCgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiKGRldiwgc29ueXBpX2RldmljZS5pb3BvcnQyKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZm4sIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7Cgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiKHYsIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7Cgl2MSA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7CglyZXR1cm4gdjE7Cn0KCiNpZiAwCi8qIEdldCBicmlnaHRuZXNzLCBodWUgZXRjLiBVbnJlbGlhYmxlLi4uICovCnN0YXRpYyB1OCBzb255cGlfcmVhZCh1OCBmbikKewoJdTggdjEsIHYyOwoJaW50IG4gPSAxMDA7CgoJd2hpbGUgKG4tLSkgewoJCXYxID0gc29ueXBpX2NhbGwyKDB4OGYsIGZuKTsKCQl2MiA9IHNvbnlwaV9jYWxsMigweDhmLCBmbik7CgkJaWYgKHYxID09IHYyICYmIHYxICE9IDB4ZmYpCgkJCXJldHVybiB2MTsKCX0KCXJldHVybiAweGZmOwp9CiNlbmRpZgoKLyogU2V0IGJyaWdodG5lc3MsIGh1ZSBldGMgKi8Kc3RhdGljIHZvaWQgc29ueXBpX3NldCh1OCBmbiwgdTggdikKewoJd2FpdF9vbl9jb21tYW5kKDAsIHNvbnlwaV9jYWxsMygweDkwLCBmbiwgdiksIElURVJBVElPTlNfU0hPUlQpOwp9CgovKiBUZXN0cyBpZiB0aGUgY2FtZXJhIGlzIHJlYWR5ICovCnN0YXRpYyBpbnQgc29ueXBpX2NhbWVyYV9yZWFkeSh2b2lkKQp7Cgl1OCB2OwoKCXYgPSBzb255cGlfY2FsbDIoMHg4ZiwgU09OWVBJX0NBTUVSQV9TVEFUVVMpOwoJcmV0dXJuICh2ICE9IDB4ZmYgJiYgKHYgJiBTT05ZUElfQ0FNRVJBX1NUQVRVU19SRUFEWSkpOwp9CgovKiBUdXJucyB0aGUgY2FtZXJhIG9mZiAqLwpzdGF0aWMgdm9pZCBzb255cGlfY2FtZXJhX29mZih2b2lkKQp7Cglzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfUElDVFVSRSwgU09OWVBJX0NBTUVSQV9NVVRFX01BU0spOwoKCWlmICghc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXIpCgkJcmV0dXJuOwoKCXNvbnlwaV9jYWxsMigweDkxLCAwKTsKCXNvbnlwaV9kZXZpY2UuY2FtZXJhX3Bvd2VyID0gMDsKfQoKLyogVHVybnMgdGhlIGNhbWVyYSBvbiAqLwpzdGF0aWMgdm9pZCBzb255cGlfY2FtZXJhX29uKHZvaWQpCnsKCWludCBpLCBqOwoKCWlmIChzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlcikKCQlyZXR1cm47CgoJZm9yIChqID0gNTsgaiA+IDA7IGotLSkgewoKCQl3aGlsZSAoc29ueXBpX2NhbGwyKDB4OTEsIDB4MSkpCgkJCW1zbGVlcCgxMCk7CgkJc29ueXBpX2NhbGwxKDB4OTMpOwoKCQlmb3IgKGkgPSA0MDA7IGkgPiAwOyBpLS0pIHsKCQkJaWYgKHNvbnlwaV9jYW1lcmFfcmVhZHkoKSkKCQkJCWJyZWFrOwoJCQltc2xlZXAoMTApOwoJCX0KCQlpZiAoaSkKCQkJYnJlYWs7Cgl9CgoJaWYgKGogPT0gMCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgInNvbnlwaTogZmFpbGVkIHRvIHBvd2VyIG9uIGNhbWVyYVxuIik7CgkJcmV0dXJuOwoJfQoKCXNvbnlwaV9zZXQoMHgxMCwgMHg1YSk7Cglzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlciA9IDE7Cn0KCi8qIHNldHMgdGhlIGJsdWV0b290aCBzdWJzeXN0ZW0gcG93ZXIgc3RhdGUgKi8Kc3RhdGljIHZvaWQgc29ueXBpX3NldGJsdWV0b290aHBvd2VyKHU4IHN0YXRlKQp7CglzdGF0ZSA9ICEhc3RhdGU7CgoJaWYgKHNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyID09IHN0YXRlKQoJCXJldHVybjsKCglzb255cGlfY2FsbDIoMHg5Niwgc3RhdGUpOwoJc29ueXBpX2NhbGwxKDB4ODIpOwoJc29ueXBpX2RldmljZS5ibHVldG9vdGhfcG93ZXIgPSBzdGF0ZTsKfQoKc3RhdGljIHZvaWQgaW5wdXRfa2V5cmVsZWFzZSh2b2lkICpkYXRhKQp7CglzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CglpbnQga2V5OwoKCXdoaWxlICgxKSB7CgkJaWYgKGtmaWZvX2dldChzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8sCgkJCSAgICAgICh1bnNpZ25lZCBjaGFyICopJmlucHV0X2RldiwKCQkJICAgICAgc2l6ZW9mKGlucHV0X2RldikpICE9IHNpemVvZihpbnB1dF9kZXYpKQoJCQlyZXR1cm47CgkJaWYgKGtmaWZvX2dldChzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8sCgkJCSAgICAgICh1bnNpZ25lZCBjaGFyICopJmtleSwKCQkJICAgICAgc2l6ZW9mKGtleSkpICE9IHNpemVvZihrZXkpKQoJCQlyZXR1cm47CgoJCW1zbGVlcCgxMCk7CgkJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9kZXYsIGtleSwgMCk7CgkJaW5wdXRfc3luYyhpbnB1dF9kZXYpOwoJfQp9CgovKiBJbnRlcnJ1cHQgaGFuZGxlcjogc29tZSBldmVudCBpcyBhdmFpbGFibGUgKi8Kc3RhdGljIGlycXJldHVybl90IHNvbnlwaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJdTggdjEsIHYyLCBldmVudCA9IDA7CglpbnQgaSwgajsKCgl2MSA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7Cgl2MiA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSArIHNvbnlwaV9kZXZpY2UuZXZ0eXBlX29mZnNldCk7CgoJZm9yIChpID0gMDsgc29ueXBpX2V2ZW50dHlwZXNbaV0ubW9kZWw7IGkrKykgewoJCWlmIChzb255cGlfZGV2aWNlLm1vZGVsICE9IHNvbnlwaV9ldmVudHR5cGVzW2ldLm1vZGVsKQoJCQljb250aW51ZTsKCQlpZiAoKHYyICYgc29ueXBpX2V2ZW50dHlwZXNbaV0uZGF0YSkgIT0KCQkgICAgc29ueXBpX2V2ZW50dHlwZXNbaV0uZGF0YSkKCQkJY29udGludWU7CgkJaWYgKCEobWFzayAmIHNvbnlwaV9ldmVudHR5cGVzW2ldLm1hc2spKQoJCQljb250aW51ZTsKCQlmb3IgKGogPSAwOyBzb255cGlfZXZlbnR0eXBlc1tpXS5ldmVudHNbal0uZXZlbnQ7IGorKykgewoJCQlpZiAodjEgPT0gc29ueXBpX2V2ZW50dHlwZXNbaV0uZXZlbnRzW2pdLmRhdGEpIHsKCQkJCWV2ZW50ID0gc29ueXBpX2V2ZW50dHlwZXNbaV0uZXZlbnRzW2pdLmV2ZW50OwoJCQkJZ290byBmb3VuZDsKCQkJfQoJCX0KCX0KCglpZiAodmVyYm9zZSkKCQlwcmludGsoS0VSTl9XQVJOSU5HCgkJICAgICAgICJzb255cGk6IHVua25vd24gZXZlbnQgcG9ydDE9MHglMDJ4LHBvcnQyPTB4JTAyeFxuIiwKCQkgICAgICAgdjEsIHYyKTsKCS8qIFdlIG5lZWQgdG8gcmV0dXJuIElSUV9IQU5ETEVEIGhlcmUgYmVjYXVzZSB0aGVyZSAqYXJlKgoJICogZXZlbnRzIGJlbG9uZ2luZyB0byB0aGUgc29ueXBpIGRldmljZSB3ZSBkb24ndCBrbm93IGFib3V0LAoJICogYnV0IHdlIHN0aWxsIGRvbid0IHdhbnQgdGhvc2UgdG8gcG9sbHV0ZSB0aGUgbG9ncy4uLiAqLwoJcmV0dXJuIElSUV9IQU5ETEVEOwoKZm91bmQ6CglpZiAodmVyYm9zZSA+IDEpCgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAic29ueXBpOiBldmVudCBwb3J0MT0weCUwMngscG9ydDI9MHglMDJ4XG4iLCB2MSwgdjIpOwoKCWlmICh1c2VpbnB1dCkgewoJCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2pvZ19kZXYgPSAmc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2OwoJCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2tleV9kZXYgPSAmc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2OwoJCXN3aXRjaCAoZXZlbnQpIHsKCQljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQOgoJCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVBfUFJFU1NFRDoKCQkJaW5wdXRfcmVwb3J0X3JlbChpbnB1dF9qb2dfZGV2LCBSRUxfV0hFRUwsIDEpOwoJCQlicmVhazsKCQljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV046CgkJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOX1BSRVNTRUQ6CgkJCWlucHV0X3JlcG9ydF9yZWwoaW5wdXRfam9nX2RldiwgUkVMX1dIRUVMLCAtMSk7CgkJCWJyZWFrOwoJCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfUFJFU1NFRDogewoJCQlpbnQga2V5ID0gQlROX01JRERMRTsKCQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9qb2dfZGV2LCBrZXksIDEpOwoJCQlrZmlmb19wdXQoc29ueXBpX2RldmljZS5pbnB1dF9maWZvLAoJCQkJICAodW5zaWduZWQgY2hhciAqKSZpbnB1dF9qb2dfZGV2LAoJCQkJICBzaXplb2YoaW5wdXRfam9nX2RldikpOwoJCQlrZmlmb19wdXQoc29ueXBpX2RldmljZS5pbnB1dF9maWZvLAoJCQkJICAodW5zaWduZWQgY2hhciAqKSZrZXksIHNpemVvZihrZXkpKTsKCQkJYnJlYWs7CgkJfQoJCWNhc2UgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEOgoJCQkvKiBOb3RoaW5nLCBub3QgYWxsIFZBSU9zIGdlbmVyYXRlIHRoaXMgZXZlbnQgKi8KCQkJYnJlYWs7CgkJfQoJCWlucHV0X3N5bmMoaW5wdXRfam9nX2Rldik7CgoJCWZvciAoaSA9IDA7IHNvbnlwaV9pbnB1dGtleXNbaV0uc29ueXBpZXY7IGkrKykgewoJCQlpbnQga2V5OwoKCQkJaWYgKGV2ZW50ICE9IHNvbnlwaV9pbnB1dGtleXNbaV0uc29ueXBpZXYpCgkJCQljb250aW51ZTsKCgkJCWtleSA9IHNvbnlwaV9pbnB1dGtleXNbaV0uaW5wdXRldjsKCQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9rZXlfZGV2LCBrZXksIDEpOwoJCQlrZmlmb19wdXQoc29ueXBpX2RldmljZS5pbnB1dF9maWZvLAoJCQkJICAodW5zaWduZWQgY2hhciAqKSZpbnB1dF9rZXlfZGV2LAoJCQkJICBzaXplb2YoaW5wdXRfa2V5X2RldikpOwoJCQlrZmlmb19wdXQoc29ueXBpX2RldmljZS5pbnB1dF9maWZvLAoJCQkJICAodW5zaWduZWQgY2hhciAqKSZrZXksIHNpemVvZihrZXkpKTsKCQl9CgkJaW5wdXRfc3luYyhpbnB1dF9rZXlfZGV2KTsKCQlzY2hlZHVsZV93b3JrKCZzb255cGlfZGV2aWNlLmlucHV0X3dvcmspOwoJfQoKCWtmaWZvX3B1dChzb255cGlfZGV2aWNlLmZpZm8sICh1bnNpZ25lZCBjaGFyICopJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKCWtpbGxfZmFzeW5jKCZzb255cGlfZGV2aWNlLmZpZm9fYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc29ueXBpX2RldmljZS5maWZvX3Byb2NfbGlzdCk7CgoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgovKiBFeHRlcm5hbCBjYW1lcmEgY29tbWFuZCAoZXhwb3J0ZWQgdG8gdGhlIG1vdGlvbiBleWUgdjRsIGRyaXZlcikgKi8KaW50IHNvbnlwaV9jYW1lcmFfY29tbWFuZChpbnQgY29tbWFuZCwgdTggdmFsdWUpCnsKCWlmICghY2FtZXJhKQoJCXJldHVybiAtRUlPOwoKCWRvd24oJnNvbnlwaV9kZXZpY2UubG9jayk7CgoJc3dpdGNoIChjb21tYW5kKSB7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQToKCQlpZiAodmFsdWUpCgkJCXNvbnlwaV9jYW1lcmFfb24oKTsKCQllbHNlCgkJCXNvbnlwaV9jYW1lcmFfb2ZmKCk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUJSSUdIVE5FU1M6CgkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0JSSUdIVE5FU1MsIHZhbHVlKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQ09OVFJBU1Q6CgkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0NPTlRSQVNULCB2YWx1ZSk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUhVRToKCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfSFVFLCB2YWx1ZSk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTE9SOgoJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9DT0xPUiwgdmFsdWUpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFTSEFSUE5FU1M6CgkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX1NIQVJQTkVTUywgdmFsdWUpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFQSUNUVVJFOgoJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9QSUNUVVJFLCB2YWx1ZSk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUFHQzoKCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQUdDLCB2YWx1ZSk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBzb255cGlfY2FtZXJhX2NvbW1hbmQgaW52YWxpZDogJWRcbiIsCgkJICAgICAgIGNvbW1hbmQpOwoJCWJyZWFrOwoJfQoJdXAoJnNvbnlwaV9kZXZpY2UubG9jayk7CglyZXR1cm4gMDsKfQoKRVhQT1JUX1NZTUJPTChzb255cGlfY2FtZXJhX2NvbW1hbmQpOwoKc3RhdGljIGludCBzb255cGlfbWlzY19mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQp7CglpbnQgcmV0dmFsOwoKCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCAmc29ueXBpX2RldmljZS5maWZvX2FzeW5jKTsKCWlmIChyZXR2YWwgPCAwKQoJCXJldHVybiByZXR2YWw7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzb255cGlfbWlzY19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7Cglzb255cGlfbWlzY19mYXN5bmMoLTEsIGZpbGUsIDApOwoJZG93bigmc29ueXBpX2RldmljZS5sb2NrKTsKCXNvbnlwaV9kZXZpY2Uub3Blbl9jb3VudC0tOwoJdXAoJnNvbnlwaV9kZXZpY2UubG9jayk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzb255cGlfbWlzY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7Cglkb3duKCZzb255cGlfZGV2aWNlLmxvY2spOwoJLyogRmx1c2ggaW5wdXQgcXVldWUgb24gZmlyc3Qgb3BlbiAqLwoJaWYgKCFzb255cGlfZGV2aWNlLm9wZW5fY291bnQpCgkJa2ZpZm9fcmVzZXQoc29ueXBpX2RldmljZS5maWZvKTsKCXNvbnlwaV9kZXZpY2Uub3Blbl9jb3VudCsrOwoJdXAoJnNvbnlwaV9kZXZpY2UubG9jayk7CglyZXR1cm4gMDsKfQoKc3RhdGljIHNzaXplX3Qgc29ueXBpX21pc2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCnsKCXNzaXplX3QgcmV0OwoJdW5zaWduZWQgY2hhciBjOwoKCWlmICgoa2ZpZm9fbGVuKHNvbnlwaV9kZXZpY2UuZmlmbykgPT0gMCkgJiYKCSAgICAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQoJCXJldHVybiAtRUFHQUlOOwoKCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0LAoJCQkJICAgICAgIGtmaWZvX2xlbihzb255cGlfZGV2aWNlLmZpZm8pICE9IDApOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoKCXdoaWxlIChyZXQgPCBjb3VudCAmJgoJICAgICAgIChrZmlmb19nZXQoc29ueXBpX2RldmljZS5maWZvLCAmYywgc2l6ZW9mKGMpKSA9PSBzaXplb2YoYykpKSB7CgkJaWYgKHB1dF91c2VyKGMsIGJ1ZisrKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJcmV0Kys7Cgl9CgoJaWYgKHJldCA+IDApIHsKCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CgkJaW5vZGUtPmlfYXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwoJfQoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB1bnNpZ25lZCBpbnQgc29ueXBpX21pc2NfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKewoJcG9sbF93YWl0KGZpbGUsICZzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0LCB3YWl0KTsKCWlmIChrZmlmb19sZW4oc29ueXBpX2RldmljZS5maWZvKSkKCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNvbnlwaV9taXNjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwKCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJaW50IHJldCA9IDA7Cgl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKCXU4IHZhbDg7Cgl1MTYgdmFsMTY7CgoJZG93bigmc29ueXBpX2RldmljZS5sb2NrKTsKCXN3aXRjaCAoY21kKSB7CgljYXNlIFNPTllQSV9JT0NHQlJUOgoJCWlmIChzb255cGlfZWNfcmVhZChTT05ZUElfTENEX0xJR0hULCAmdmFsOCkpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NTQlJUOgoJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgYXJncCwgc2l6ZW9mKHZhbDgpKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfTENEX0xJR0hULCB2YWw4KSkKCQkJcmV0ID0gLUVJTzsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ0dCQVQxQ0FQOgoJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDFfRlVMTCwgJnZhbDE2KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JBVDFSRU06CgkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMV9MRUZULCAmdmFsMTYpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NHQkFUMkNBUDoKCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQyX0ZVTEwsICZ2YWwxNikpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ0dCQVQyUkVNOgoJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDJfTEVGVCwgJnZhbDE2KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JBVEZMQUdTOgoJCWlmIChzb255cGlfZWNfcmVhZChTT05ZUElfQkFUX0ZMQUdTLCAmdmFsOCkpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCXZhbDggJj0gMHgwNzsKCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JMVUU6CgkJdmFsOCA9IHNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyOwoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NTQkxVRToKCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbDgsIGFyZ3AsIHNpemVvZih2YWw4KSkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCXNvbnlwaV9zZXRibHVldG9vdGhwb3dlcih2YWw4KTsKCQlicmVhazsKCS8qIEZBTiBDb250cm9scyAqLwoJY2FzZSBTT05ZUElfSU9DR0ZBTjoKCQlpZiAoc29ueXBpX2VjX3JlYWQoU09OWVBJX0ZBTjBfU1RBVFVTLCAmdmFsOCkpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NTRkFOOgoJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgYXJncCwgc2l6ZW9mKHZhbDgpKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfRkFOMF9TVEFUVVMsIHZhbDgpKQoJCQlyZXQgPSAtRUlPOwoJCWJyZWFrOwoJLyogR0VUIFRlbXBlcmF0dXJlICh1c2VmdWwgdW5kZXIgQVBNKSAqLwoJY2FzZSBTT05ZUElfSU9DR1RFTVA6CgkJaWYgKHNvbnlwaV9lY19yZWFkKFNPTllQSV9URU1QX1NUQVRVUywgJnZhbDgpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXQgPSAtRUlOVkFMOwoJfQoJdXAoJnNvbnlwaV9kZXZpY2UubG9jayk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzb255cGlfbWlzY19mb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLnJlYWQJCT0gc29ueXBpX21pc2NfcmVhZCwKCS5wb2xsCQk9IHNvbnlwaV9taXNjX3BvbGwsCgkub3BlbgkJPSBzb255cGlfbWlzY19vcGVuLAoJLnJlbGVhc2UJPSBzb255cGlfbWlzY19yZWxlYXNlLAoJLmZhc3luYwkJPSBzb255cGlfbWlzY19mYXN5bmMsCgkuaW9jdGwJCT0gc29ueXBpX21pc2NfaW9jdGwsCn07CgpzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugc29ueXBpX21pc2NfZGV2aWNlID0gewoJLm1pbm9yCQk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKCS5uYW1lCQk9ICJzb255cGkiLAoJLmZvcHMJCT0gJnNvbnlwaV9taXNjX2ZvcHMsCn07CgpzdGF0aWMgdm9pZCBzb255cGlfZW5hYmxlKHVuc2lnbmVkIGludCBjYW1lcmFfb24pCnsKCWlmIChzb255cGlfZGV2aWNlLm1vZGVsID09IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIpCgkJc29ueXBpX3R5cGUyX3NycygpOwoJZWxzZQoJCXNvbnlwaV90eXBlMV9zcnMoKTsKCglzb255cGlfY2FsbDEoMHg4Mik7Cglzb255cGlfY2FsbDIoMHg4MSwgMHhmZik7Cglzb255cGlfY2FsbDEoY29tcGF0ID8gMHg5MiA6IDB4ODIpOwoKCS8qIEVuYWJsZSBBQ1BJIG1vZGUgdG8gZ2V0IEZuIGtleSBldmVudHMgKi8KCWlmICghU09OWVBJX0FDUElfQUNUSVZFICYmIGZua2V5aW5pdCkKCQlvdXRiKDB4ZjAsIDB4YjIpOwoKCWlmIChjYW1lcmEgJiYgY2FtZXJhX29uKQoJCXNvbnlwaV9jYW1lcmFfb24oKTsKfQoKc3RhdGljIGludCBzb255cGlfZGlzYWJsZSh2b2lkKQp7Cglzb255cGlfY2FsbDIoMHg4MSwgMCk7CS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IG1vcmUgZXZlbnRzICovCglpZiAoY2FtZXJhKQoJCXNvbnlwaV9jYW1lcmFfb2ZmKCk7CgoJLyogZGlzYWJsZSBBQ1BJIG1vZGUgKi8KCWlmICghU09OWVBJX0FDUElfQUNUSVZFICYmIGZua2V5aW5pdCkKCQlvdXRiKDB4ZjEsIDB4YjIpOwoKCWlmIChzb255cGlfZGV2aWNlLm1vZGVsID09IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIpCgkJc29ueXBpX3R5cGUyX2RpcygpOwoJZWxzZQoJCXNvbnlwaV90eXBlMV9kaXMoKTsKCXJldHVybiAwOwp9CgojaWZkZWYgQ09ORklHX1BNCnN0YXRpYyBpbnQgb2xkX2NhbWVyYV9wb3dlcjsKCnN0YXRpYyBpbnQgc29ueXBpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHUzMiBsZXZlbCkKewoJaWYgKGxldmVsID09IFNVU1BFTkRfRElTQUJMRSkgewoJCW9sZF9jYW1lcmFfcG93ZXIgPSBzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlcjsKCQlzb255cGlfZGlzYWJsZSgpOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKewoJaWYgKGxldmVsID09IFJFU1VNRV9FTkFCTEUpCgkJc29ueXBpX2VuYWJsZShvbGRfY2FtZXJhX3Bvd2VyKTsKCXJldHVybiAwOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgc29ueXBpX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKewoJc29ueXBpX2Rpc2FibGUoKTsKfQoKc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHNvbnlwaV9kcml2ZXIgPSB7CgkubmFtZQkJPSAic29ueXBpIiwKCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAojaWZkZWYgQ09ORklHX1BNCgkuc3VzcGVuZAk9IHNvbnlwaV9zdXNwZW5kLAoJLnJlc3VtZQkJPSBzb255cGlfcmVzdW1lLAojZW5kaWYKCS5zaHV0ZG93bgk9IHNvbnlwaV9zaHV0ZG93biwKfTsKCnN0YXRpYyBpbnQgX19kZXZpbml0IHNvbnlwaV9wcm9iZSh2b2lkKQp7CglpbnQgaSwgcmV0OwoJc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCAqaW9wb3J0X2xpc3Q7CglzdHJ1Y3Qgc29ueXBpX2lycV9saXN0ICppcnFfbGlzdDsKCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CgoJcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKCQkJCVBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLCBOVUxMKTsKCglzb255cGlfZGV2aWNlLmRldiA9IHBjaWRldjsKCXNvbnlwaV9kZXZpY2UubW9kZWwgPSBwY2lkZXYgPwoJCVNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEgOiBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyOwoKCXNwaW5fbG9ja19pbml0KCZzb255cGlfZGV2aWNlLmZpZm9fbG9jayk7Cglzb255cGlfZGV2aWNlLmZpZm8gPSBrZmlmb19hbGxvYyhTT05ZUElfQlVGX1NJWkUsIEdGUF9LRVJORUwsCgkJCQkJICZzb255cGlfZGV2aWNlLmZpZm9fbG9jayk7CglpZiAoSVNfRVJSKHNvbnlwaV9kZXZpY2UuZmlmbykpIHsKCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaToga2ZpZm9fYWxsb2MgZmFpbGVkXG4iKTsKCQlyZXQgPSBQVFJfRVJSKHNvbnlwaV9kZXZpY2UuZmlmbyk7CgkJZ290byBvdXRfZmlmbzsKCX0KCglpbml0X3dhaXRxdWV1ZV9oZWFkKCZzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0KTsKCWluaXRfTVVURVgoJnNvbnlwaV9kZXZpY2UubG9jayk7Cglzb255cGlfZGV2aWNlLmJsdWV0b290aF9wb3dlciA9IC0xOwoKCWlmIChwY2lkZXYgJiYgcGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkgewoJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWRcbiIpOwoJCXJldCA9IC1FSU87CgkJZ290byBvdXRfcGNpZW5hYmxlOwoJfQoKCWlmIChtaW5vciAhPSAtMSkKCQlzb255cGlfbWlzY19kZXZpY2UubWlub3IgPSBtaW5vcjsKCWlmICgocmV0ID0gbWlzY19yZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKSkpIHsKCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogbWlzY19yZWdpc3RlciBmYWlsZWRcbiIpOwoJCWdvdG8gb3V0X21pc2NyZWc7Cgl9CgoJaWYgKHNvbnlwaV9kZXZpY2UubW9kZWwgPT0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMikgewoJCWlvcG9ydF9saXN0ID0gc29ueXBpX3R5cGUyX2lvcG9ydF9saXN0OwoJCXNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUgPSBTT05ZUElfVFlQRTJfUkVHSU9OX1NJWkU7CgkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUyX0VWVFlQRV9PRkZTRVQ7CgkJaXJxX2xpc3QgPSBzb255cGlfdHlwZTJfaXJxX2xpc3Q7Cgl9IGVsc2UgewoJCWlvcG9ydF9saXN0ID0gc29ueXBpX3R5cGUxX2lvcG9ydF9saXN0OwoJCXNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUgPSBTT05ZUElfVFlQRTFfUkVHSU9OX1NJWkU7CgkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUxX0VWVFlQRV9PRkZTRVQ7CgkJaXJxX2xpc3QgPSBzb255cGlfdHlwZTFfaXJxX2xpc3Q7Cgl9CgoJZm9yIChpID0gMDsgaW9wb3J0X2xpc3RbaV0ucG9ydDE7IGkrKykgewoJCWlmIChyZXF1ZXN0X3JlZ2lvbihpb3BvcnRfbGlzdFtpXS5wb3J0MSwKCQkJCSAgIHNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUsCgkJCQkgICAiU29ueSBQcm9ncmFtYWJsZSBJL08gRGV2aWNlIikpIHsKCQkJLyogZ2V0IHRoZSBpb3BvcnQgKi8KCQkJc29ueXBpX2RldmljZS5pb3BvcnQxID0gaW9wb3J0X2xpc3RbaV0ucG9ydDE7CgkJCXNvbnlwaV9kZXZpY2UuaW9wb3J0MiA9IGlvcG9ydF9saXN0W2ldLnBvcnQyOwoJCQlicmVhazsKCQl9Cgl9CglpZiAoIXNvbnlwaV9kZXZpY2UuaW9wb3J0MSkgewoJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiByZXF1ZXN0X3JlZ2lvbiBmYWlsZWRcbiIpOwoJCXJldCA9IC1FTk9ERVY7CgkJZ290byBvdXRfcmVxcmVnOwoJfQoKCWZvciAoaSA9IDA7IGlycV9saXN0W2ldLmlycTsgaSsrKSB7CgoJCXNvbnlwaV9kZXZpY2UuaXJxID0gaXJxX2xpc3RbaV0uaXJxOwoJCXNvbnlwaV9kZXZpY2UuYml0cyA9IGlycV9saXN0W2ldLmJpdHM7CgoJCWlmICghcmVxdWVzdF9pcnEoc29ueXBpX2RldmljZS5pcnEsIHNvbnlwaV9pcnEsCgkJCQkgU0FfU0hJUlEsICJzb255cGkiLCBzb255cGlfaXJxKSkKCQkJYnJlYWs7Cgl9CgoJaWYgKCFpcnFfbGlzdFtpXS5pcnEpIHsKCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogcmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKCQlyZXQgPSAtRU5PREVWOwoJCWdvdG8gb3V0X3JlcWlycTsKCX0KCglpZiAodXNlaW5wdXQpIHsKCQkvKiBJbml0aWFsaXplIHRoZSBJbnB1dCBEcml2ZXJzOiBqb2dkaWFsICovCgkJaW50IGk7CgkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2LmV2Yml0WzBdID0KCQkJQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVMKTsKCQlzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYua2V5Yml0W0xPTkcoQlROX01PVVNFKV0gPQoJCQlCSVQoQlROX01JRERMRSk7CgkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2LnJlbGJpdFswXSA9IEJJVChSRUxfV0hFRUwpOwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5uYW1lID0KCQkJa21hbGxvYyhzaXplb2YoU09OWVBJX0pPR19JTlBVVE5BTUUpLCBHRlBfS0VSTkVMKTsKCQlpZiAoIXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5uYW1lKSB7CgkJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBrbWFsbG9jIGZhaWxlZFxuIik7CgkJCXJldCA9IC1FTk9NRU07CgkJCWdvdG8gb3V0X2lua21hbGxvY2lucHV0MTsKCQl9CgkJc3ByaW50Zihzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYubmFtZSwgU09OWVBJX0pPR19JTlBVVE5BTUUpOwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5pZC5idXN0eXBlID0gQlVTX0lTQTsKCQlzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYuaWQudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9TT05ZOwoKCQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJnNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldik7CgkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgaW5wdXQgbWV0aG9kIGluc3RhbGxlZC5cbiIsCgkJICAgICAgIHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5uYW1lKTsKCgkJLyogSW5pdGlhbGl6ZSB0aGUgSW5wdXQgRHJpdmVyczogc3BlY2lhbCBrZXlzICovCgkJc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2LmV2Yml0WzBdID0gQklUKEVWX0tFWSk7CgkJZm9yIChpID0gMDsgc29ueXBpX2lucHV0a2V5c1tpXS5zb255cGlldjsgaSsrKQoJCQlpZiAoc29ueXBpX2lucHV0a2V5c1tpXS5pbnB1dGV2KQoJCQkJc2V0X2JpdChzb255cGlfaW5wdXRrZXlzW2ldLmlucHV0ZXYsCgkJCQkJc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2LmtleWJpdCk7CgkJc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2Lm5hbWUgPQoJCQlrbWFsbG9jKHNpemVvZihTT05ZUElfS0VZX0lOUFVUTkFNRSksIEdGUF9LRVJORUwpOwoJCWlmICghc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2Lm5hbWUpIHsKCQkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IGttYWxsb2MgZmFpbGVkXG4iKTsKCQkJcmV0ID0gLUVOT01FTTsKCQkJZ290byBvdXRfaW5rbWFsbG9jaW5wdXQyOwoJCX0KCQlzcHJpbnRmKHNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5uYW1lLCBTT05ZUElfS0VZX0lOUFVUTkFNRSk7CgkJc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2LmlkLmJ1c3R5cGUgPSBCVVNfSVNBOwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5pZC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1NPTlk7CgoJCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2KTsKCQlwcmludGsoS0VSTl9JTkZPICIlcyBpbnB1dCBtZXRob2QgaW5zdGFsbGVkLlxuIiwKCQkgICAgICAgc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2Lm5hbWUpOwoKCQlzcGluX2xvY2tfaW5pdCgmc29ueXBpX2RldmljZS5pbnB1dF9maWZvX2xvY2spOwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbyA9CgkJCWtmaWZvX2FsbG9jKFNPTllQSV9CVUZfU0laRSwgR0ZQX0tFUk5FTCwKCQkJCSAgICAmc29ueXBpX2RldmljZS5pbnB1dF9maWZvX2xvY2spOwoJCWlmIChJU19FUlIoc29ueXBpX2RldmljZS5pbnB1dF9maWZvKSkgewoJCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaToga2ZpZm9fYWxsb2MgZmFpbGVkXG4iKTsKCQkJcmV0ID0gUFRSX0VSUihzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pOwoJCQlnb3RvIG91dF9pbmZpZm87CgkJfQoKCQlJTklUX1dPUksoJnNvbnlwaV9kZXZpY2UuaW5wdXRfd29yaywgaW5wdXRfa2V5cmVsZWFzZSwgTlVMTCk7Cgl9CgoJc29ueXBpX2RldmljZS5wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgic29ueXBpIiwgLTEsCgkJCQkJCQkgICAgIE5VTEwsIDApOwoJaWYgKElTX0VSUihzb255cGlfZGV2aWNlLnBkZXYpKSB7CgkJcmV0ID0gUFRSX0VSUihzb255cGlfZGV2aWNlLnBkZXYpOwoJCWdvdG8gb3V0X3BsYXRmb3JtZGV2OwoJfQoKCXNvbnlwaV9lbmFibGUoMCk7CgoJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbGxlciBEcml2ZXIiCgkgICAgICAgInYlcy5cbiIsIFNPTllQSV9EUklWRVJfVkVSU0lPTik7CglwcmludGsoS0VSTl9JTkZPICJzb255cGk6IGRldGVjdGVkICVzIG1vZGVsLCAiCgkgICAgICAgInZlcmJvc2UgPSAlZCwgZm5rZXlpbml0ID0gJXMsIGNhbWVyYSA9ICVzLCAiCgkgICAgICAgImNvbXBhdCA9ICVzLCBtYXNrID0gMHglMDhseCwgdXNlaW5wdXQgPSAlcywgYWNwaSA9ICVzXG4iLAoJICAgICAgIChzb255cGlfZGV2aWNlLm1vZGVsID09IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEpID8KCQkJInR5cGUxIiA6ICJ0eXBlMiIsCgkgICAgICAgdmVyYm9zZSwKCSAgICAgICBmbmtleWluaXQgPyAib24iIDogIm9mZiIsCgkgICAgICAgY2FtZXJhID8gIm9uIiA6ICJvZmYiLAoJICAgICAgIGNvbXBhdCA/ICJvbiIgOiAib2ZmIiwKCSAgICAgICBtYXNrLAoJICAgICAgIHVzZWlucHV0ID8gIm9uIiA6ICJvZmYiLAoJICAgICAgIFNPTllQSV9BQ1BJX0FDVElWRSA/ICJvbiIgOiAib2ZmIik7CglwcmludGsoS0VSTl9JTkZPICJzb255cGk6IGVuYWJsZWQgYXQgaXJxPSVkLCBwb3J0MT0weCV4LCBwb3J0Mj0weCV4XG4iLAoJICAgICAgIHNvbnlwaV9kZXZpY2UuaXJxLAoJICAgICAgIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSwgc29ueXBpX2RldmljZS5pb3BvcnQyKTsKCglpZiAobWlub3IgPT0gLTEpCgkJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBkZXZpY2UgYWxsb2NhdGVkIG1pbm9yIGlzICVkXG4iLAoJCSAgICAgICBzb255cGlfbWlzY19kZXZpY2UubWlub3IpOwoKCXJldHVybiAwOwoKb3V0X3BsYXRmb3JtZGV2OgoJa2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pOwpvdXRfaW5maWZvOgoJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldik7CglrZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYubmFtZSk7Cm91dF9pbmttYWxsb2NpbnB1dDI6CglpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2KTsKCWtmcmVlKHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5uYW1lKTsKb3V0X2lua21hbGxvY2lucHV0MToKCWZyZWVfaXJxKHNvbnlwaV9kZXZpY2UuaXJxLCBzb255cGlfaXJxKTsKb3V0X3JlcWlycToKCXJlbGVhc2VfcmVnaW9uKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSwgc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSk7Cm91dF9yZXFyZWc6CgltaXNjX2RlcmVnaXN0ZXIoJnNvbnlwaV9taXNjX2RldmljZSk7Cm91dF9taXNjcmVnOgoJaWYgKHBjaWRldikKCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpZGV2KTsKb3V0X3BjaWVuYWJsZToKCWtmaWZvX2ZyZWUoc29ueXBpX2RldmljZS5maWZvKTsKb3V0X2ZpZm86CglwY2lfZGV2X3B1dChzb255cGlfZGV2aWNlLmRldik7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCBfX2RldmV4aXQgc29ueXBpX3JlbW92ZSh2b2lkKQp7Cglzb255cGlfZGlzYWJsZSgpOwoKCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNvbnlwaV9kZXZpY2UucGRldik7CgoJaWYgKHVzZWlucHV0KSB7CgkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldik7CgkJa2ZyZWUoc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2Lm5hbWUpOwoJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYpOwoJCWtmcmVlKHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5uYW1lKTsKCQlrZmlmb19mcmVlKHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbyk7Cgl9CgoJZnJlZV9pcnEoc29ueXBpX2RldmljZS5pcnEsIHNvbnlwaV9pcnEpOwoJcmVsZWFzZV9yZWdpb24oc29ueXBpX2RldmljZS5pb3BvcnQxLCBzb255cGlfZGV2aWNlLnJlZ2lvbl9zaXplKTsKCW1pc2NfZGVyZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKCWlmIChzb255cGlfZGV2aWNlLmRldikKCQlwY2lfZGlzYWJsZV9kZXZpY2Uoc29ueXBpX2RldmljZS5kZXYpOwoJa2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmZpZm8pOwoJcGNpX2Rldl9wdXQoc29ueXBpX2RldmljZS5kZXYpOwoJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiByZW1vdmVkLlxuIik7Cn0KCnN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIHNvbnlwaV9kbWlfdGFibGVbXSA9IHsKCXsKCQkuaWRlbnQgPSAiU29ueSBWYWlvIiwKCQkubWF0Y2hlcyA9IHsKCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAoJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBDRy0iKSwKCQl9LAoJfSwKCXsKCQkuaWRlbnQgPSAiU29ueSBWYWlvIiwKCQkubWF0Y2hlcyA9IHsKCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAoJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi0iKSwKCQl9LAoJfSwKCXsgfQp9OwoKc3RhdGljIGludCBfX2luaXQgc29ueXBpX2luaXQodm9pZCkKewoJaW50IHJldDsKCglpZiAoIWRtaV9jaGVja19zeXN0ZW0oc29ueXBpX2RtaV90YWJsZSkpCgkJcmV0dXJuIC1FTk9ERVY7CgoJcmV0ID0gZHJpdmVyX3JlZ2lzdGVyKCZzb255cGlfZHJpdmVyKTsKCWlmIChyZXQpCgkJcmV0dXJuIHJldDsKCglyZXQgPSBzb255cGlfcHJvYmUoKTsKCWlmIChyZXQpCgkJZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlwaV9kcml2ZXIpOwoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBzb255cGlfZXhpdCh2b2lkKQp7Cglkcml2ZXJfdW5yZWdpc3Rlcigmc29ueXBpX2RyaXZlcik7Cglzb255cGlfcmVtb3ZlKCk7Cn0KCm1vZHVsZV9pbml0KHNvbnlwaV9pbml0KTsKbW9kdWxlX2V4aXQoc29ueXBpX2V4aXQpOwo=