LyoKICogU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2wgRGV2aWNlIGRyaXZlciBmb3IgVkFJTwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDUgTmFyYXlhbmFuIFIgUyA8bmFyc0BrYWRhbWJhLm9yZz4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgQWxj9HZlIDx3d3cuYWxjb3ZlLmNvbT4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxIE1pY2hhZWwgQXNobGV5IDxtLmFzaGxleUB1bnN3LmVkdS5hdT4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxIEp1bmljaGkgTW9yaXRhIDxqdW4xbUBtYXJzLmR0aS5uZS5qcD4KICoKICogQ29weXJpZ2h0IChDKSAyMDAwIFRha2F5YSBLaW5qbyA8dC1raW5qb0B0YzQuc28tbmV0Lm5lLmpwPgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDAgQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2VAdmFsaW51eC5jb20+CiAqCiAqIEVhcmxpZXIgd29yayBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIFBhdWwgYFJ1c3R5JyBSdXNzZWxsIGFuZCBQYXVsIE1hY2tlcnJhcy4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvd2FpdC5oPgojaW5jbHVkZSA8bGludXgvYWNwaS5oPgojaW5jbHVkZSA8bGludXgvZG1pLmg+CiNpbmNsdWRlIDxsaW51eC9lcnIuaD4KI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgoKI2luY2x1ZGUgPGxpbnV4L3NvbnlwaS5oPgoKI2RlZmluZSBTT05ZUElfRFJJVkVSX1ZFUlNJT04JICIxLjI2IgoKTU9EVUxFX0FVVEhPUigiU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbCBEZXZpY2UgZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX1ZFUlNJT04oU09OWVBJX0RSSVZFUl9WRVJTSU9OKTsKCnN0YXRpYyBpbnQgbWlub3IgPSAtMTsKbW9kdWxlX3BhcmFtKG1pbm9yLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG1pbm9yLAoJCSAibWlub3IgbnVtYmVyIG9mIHRoZSBtaXNjIGRldmljZSwgZGVmYXVsdCBpcyAtMSAoYXV0b21hdGljKSIpOwoKc3RhdGljIGludCB2ZXJib3NlOwkJLyogPSAwICovCm1vZHVsZV9wYXJhbSh2ZXJib3NlLCBpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJiZSB2ZXJib3NlLCBkZWZhdWx0IGlzIDAgKG5vKSIpOwoKc3RhdGljIGludCBmbmtleWluaXQ7CQkvKiA9IDAgKi8KbW9kdWxlX3BhcmFtKGZua2V5aW5pdCwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhmbmtleWluaXQsCgkJICJzZXQgdGhpcyBpZiB5b3VyIEZuIGtleXMgZG8gbm90IGdlbmVyYXRlIGFueSBldmVudCIpOwoKc3RhdGljIGludCBjYW1lcmE7CQkvKiA9IDAgKi8KbW9kdWxlX3BhcmFtKGNhbWVyYSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhjYW1lcmEsCgkJICJzZXQgdGhpcyBpZiB5b3UgaGF2ZSBhIE1vdGlvbkV5ZSBjYW1lcmEgKFBpY3R1cmVCb29rIHNlcmllcykiKTsKCnN0YXRpYyBpbnQgY29tcGF0OwkJLyogPSAwICovCm1vZHVsZV9wYXJhbShjb21wYXQsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoY29tcGF0LAoJCSAic2V0IHRoaXMgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZSIpOwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFzayA9IDB4ZmZmZmZmZmY7Cm1vZHVsZV9wYXJhbShtYXNrLCB1bG9uZywgMDY0NCk7Ck1PRFVMRV9QQVJNX0RFU0MobWFzaywKCQkgInNldCB0aGlzIHRvIHRoZSBtYXNrIG9mIGV2ZW50IHlvdSB3YW50IHRvIGVuYWJsZSAoc2VlIGRvYykiKTsKCnN0YXRpYyBpbnQgdXNlaW5wdXQgPSAxOwptb2R1bGVfcGFyYW0odXNlaW5wdXQsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0ModXNlaW5wdXQsCgkJICJzZXQgdGhpcyBpZiB5b3Ugd291bGQgbGlrZSBzb255cGkgdG8gZmVlZCBldmVudHMgdG8gdGhlIGlucHV0IHN1YnN5c3RlbSIpOwoKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxCTEKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyCTIKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzCTMKCi8qIHR5cGUxIG1vZGVscyB1c2UgdGhvc2UgKi8KI2RlZmluZSBTT05ZUElfSVJRX1BPUlQJCQkweDgwMzQKI2RlZmluZSBTT05ZUElfSVJRX1NISUZUCQkyMgojZGVmaW5lIFNPTllQSV9UWVBFMV9CQVNFCQkweDUwCiNkZWZpbmUgU09OWVBJX0cxMEEJCQkoU09OWVBJX1RZUEUxX0JBU0UrMHgxNCkKI2RlZmluZSBTT05ZUElfVFlQRTFfUkVHSU9OX1NJWkUJMHgwOAojZGVmaW5lIFNPTllQSV9UWVBFMV9FVlRZUEVfT0ZGU0VUCTB4MDQKCi8qIHR5cGUyIHNlcmllcyBzcGVjaWZpY3MgKi8KI2RlZmluZSBTT05ZUElfU0lSUQkJCTB4OWIKI2RlZmluZSBTT05ZUElfU0xPQgkJCTB4OWMKI2RlZmluZSBTT05ZUElfU0hJQgkJCTB4OWQKI2RlZmluZSBTT05ZUElfVFlQRTJfUkVHSU9OX1NJWkUJMHgyMAojZGVmaW5lIFNPTllQSV9UWVBFMl9FVlRZUEVfT0ZGU0VUCTB4MTIKCi8qIHR5cGUzIHNlcmllcyBzcGVjaWZpY3MgKi8KI2RlZmluZSBTT05ZUElfVFlQRTNfQkFTRQkJMHg0MAojZGVmaW5lIFNPTllQSV9UWVBFM19HSUQyCQkoU09OWVBJX1RZUEUzX0JBU0UrMHg0OCkgLyogMTYgYml0cyAqLwojZGVmaW5lIFNPTllQSV9UWVBFM19NSVNDCQkoU09OWVBJX1RZUEUzX0JBU0UrMHg2ZCkgLyogOCBiaXRzICAqLwojZGVmaW5lIFNPTllQSV9UWVBFM19SRUdJT05fU0laRQkweDIwCiNkZWZpbmUgU09OWVBJX1RZUEUzX0VWVFlQRV9PRkZTRVQJMHgxMgoKLyogYmF0dGVyeSAvIGJyaWdodG5lc3MgYWRkcmVzc2VzICovCiNkZWZpbmUgU09OWVBJX0JBVF9GTEFHUwkweDgxCiNkZWZpbmUgU09OWVBJX0xDRF9MSUdIVAkweDk2CiNkZWZpbmUgU09OWVBJX0JBVDFfUENUUk0JMHhhMAojZGVmaW5lIFNPTllQSV9CQVQxX0xFRlQJMHhhMgojZGVmaW5lIFNPTllQSV9CQVQxX01BWFJUCTB4YTQKI2RlZmluZSBTT05ZUElfQkFUMl9QQ1RSTQkweGE4CiNkZWZpbmUgU09OWVBJX0JBVDJfTEVGVAkweGFhCiNkZWZpbmUgU09OWVBJX0JBVDJfTUFYUlQJMHhhYwojZGVmaW5lIFNPTllQSV9CQVQxX01BWFRLCTB4YjAKI2RlZmluZSBTT05ZUElfQkFUMV9GVUxMCTB4YjIKI2RlZmluZSBTT05ZUElfQkFUMl9NQVhUSwkweGI4CiNkZWZpbmUgU09OWVBJX0JBVDJfRlVMTAkweGJhCgovKiBGQU4wIGluZm9ybWF0aW9uIChyZXZlcnNlIGVuZ2luZWVyZWQgZnJvbSBBQ1BJIHRhYmxlcykgKi8KI2RlZmluZSBTT05ZUElfRkFOMF9TVEFUVVMJMHg5MwojZGVmaW5lIFNPTllQSV9URU1QX1NUQVRVUwkweEMxCgovKiBpb3BvcnRzIHVzZWQgZm9yIGJyaWdodG5lc3MgYW5kIHR5cGUyIGV2ZW50cyAqLwojZGVmaW5lIFNPTllQSV9EQVRBX0lPUE9SVAkweDYyCiNkZWZpbmUgU09OWVBJX0NTVF9JT1BPUlQJMHg2NgoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBpb3BvcnRzICovCnN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3QgewoJdTE2CXBvcnQxOwoJdTE2CXBvcnQyOwp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3Qgc29ueXBpX3R5cGUxX2lvcG9ydF9saXN0W10gPSB7Cgl7IDB4MTBjMCwgMHgxMGM0IH0sCS8qIGxvb2tzIGxpa2UgdGhlIGRlZmF1bHQgb24gQzFWeCAqLwoJeyAweDEwODAsIDB4MTA4NCB9LAoJeyAweDEwOTAsIDB4MTA5NCB9LAoJeyAweDEwYTAsIDB4MTBhNCB9LAoJeyAweDEwYjAsIDB4MTBiNCB9LAoJeyAweDAsIDB4MCB9Cn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCBzb255cGlfdHlwZTJfaW9wb3J0X2xpc3RbXSA9IHsKCXsgMHgxMDgwLCAweDEwODQgfSwKCXsgMHgxMGEwLCAweDEwYTQgfSwKCXsgMHgxMGMwLCAweDEwYzQgfSwKCXsgMHgxMGUwLCAweDEwZTQgfSwKCXsgMHgwLCAweDAgfQp9OwoKLyogc2FtZSBhcyBpbiB0eXBlIDIgbW9kZWxzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2lvcG9ydF9saXN0ICpzb255cGlfdHlwZTNfaW9wb3J0X2xpc3QgPQoJc29ueXBpX3R5cGUyX2lvcG9ydF9saXN0OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBpbnRlcnJ1cHRzICovCnN0cnVjdCBzb255cGlfaXJxX2xpc3QgewoJdTE2CWlycTsKCXUxNgliaXRzOwp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfaXJxX2xpc3Qgc29ueXBpX3R5cGUxX2lycV9saXN0W10gPSB7Cgl7IDExLCAweDIgfSwJLyogSVJRIDExLCBHTzIyPTAsR08yMz0xIGluIEFNTCAqLwoJeyAxMCwgMHgxIH0sCS8qIElSUSAxMCwgR08yMj0xLEdPMjM9MCBpbiBBTUwgKi8KCXsgIDUsIDB4MCB9LAkvKiBJUlEgIDUsIEdPMjI9MCxHTzIzPTAgaW4gQU1MICovCgl7ICAwLCAweDMgfQkvKiBubyBJUlEsIEdPMjI9MSxHTzIzPTEgaW4gQU1MICovCn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9pcnFfbGlzdCBzb255cGlfdHlwZTJfaXJxX2xpc3RbXSA9IHsKCXsgMTEsIDB4ODAgfSwJLyogSVJRIDExLCAweDgwIGluIFNJUlEgaW4gQU1MICovCgl7IDEwLCAweDQwIH0sCS8qIElSUSAxMCwgMHg0MCBpbiBTSVJRIGluIEFNTCAqLwoJeyAgOSwgMHgyMCB9LAkvKiBJUlEgIDksIDB4MjAgaW4gU0lSUSBpbiBBTUwgKi8KCXsgIDYsIDB4MTAgfSwJLyogSVJRICA2LCAweDEwIGluIFNJUlEgaW4gQU1MICovCgl7ICAwLCAweDAwIH0JLyogbm8gSVJRLCAweDAwIGluIFNJUlEgaW4gQU1MICovCn07CgovKiBzYW1lIGFzIGluIHR5cGUyIG1vZGVscyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9pcnFfbGlzdCAqc29ueXBpX3R5cGUzX2lycV9saXN0ID0gc29ueXBpX3R5cGUyX2lycV9saXN0OwoKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0JSSUdIVE5FU1MJCTAKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRSQVNUCQkJMQojZGVmaW5lIFNPTllQSV9DQU1FUkFfSFVFCQkJMgojZGVmaW5lIFNPTllQSV9DQU1FUkFfQ09MT1IJCQkzCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSEFSUE5FU1MJCQk0CgojZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRQkJCTUKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0VYUE9TVVJFX01BU0sJCTB4QwojZGVmaW5lIFNPTllQSV9DQU1FUkFfV0hJVEVfQkFMQU5DRV9NQVNLCTB4MwojZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRV9NT0RFX01BU0sJCTB4MzAKI2RlZmluZSBTT05ZUElfQ0FNRVJBX01VVEVfTUFTSwkJCTB4NDAKCi8qIHRoZSByZXN0IGRvbid0IG5lZWQgYSBsb29wIHVudGlsIG5vdCAweGZmICovCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9BR0MJCQk2CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9BR0NfTUFTSwkJCTB4MzAKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIVVRURVJfTUFTSyAJCTB4NwoKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIVVRET1dOX1JFUVVFU1QJCTcKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRST0wJCQkweDEwCgojZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTIAkJCTcKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVU19SRUFEWSAJCTB4MgojZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTX1BPU0lUSU9OCQkweDQKCiNkZWZpbmUgU09OWVBJX0RJUkVDVElPTl9CQUNLV0FSRFMgCQkweDQKCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9SRVZJU0lPTiAJCQk4CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9ST01WRVJTSU9OIAkJOQoKLyogRXZlbnQgbWFza3MgKi8KI2RlZmluZSBTT05ZUElfSk9HR0VSX01BU0sJCQkweDAwMDAwMDAxCiNkZWZpbmUgU09OWVBJX0NBUFRVUkVfTUFTSwkJCTB4MDAwMDAwMDIKI2RlZmluZSBTT05ZUElfRk5LRVlfTUFTSwkJCTB4MDAwMDAwMDQKI2RlZmluZSBTT05ZUElfQkxVRVRPT1RIX01BU0sJCQkweDAwMDAwMDA4CiNkZWZpbmUgU09OWVBJX1BLRVlfTUFTSwkJCTB4MDAwMDAwMTAKI2RlZmluZSBTT05ZUElfQkFDS19NQVNLCQkJMHgwMDAwMDAyMAojZGVmaW5lIFNPTllQSV9IRUxQX01BU0sJCQkweDAwMDAwMDQwCiNkZWZpbmUgU09OWVBJX0xJRF9NQVNLCQkJCTB4MDAwMDAwODAKI2RlZmluZSBTT05ZUElfWk9PTV9NQVNLCQkJMHgwMDAwMDEwMAojZGVmaW5lIFNPTllQSV9USFVNQlBIUkFTRV9NQVNLCQkJMHgwMDAwMDIwMAojZGVmaW5lIFNPTllQSV9NRVlFX01BU0sJCQkweDAwMDAwNDAwCiNkZWZpbmUgU09OWVBJX01FTU9SWVNUSUNLX01BU0sJCQkweDAwMDAwODAwCiNkZWZpbmUgU09OWVBJX0JBVFRFUllfTUFTSwkJCTB4MDAwMDEwMDAKI2RlZmluZSBTT05ZUElfV0lSRUxFU1NfTUFTSwkJCTB4MDAwMDIwMDAKCnN0cnVjdCBzb255cGlfZXZlbnQgewoJdTgJZGF0YTsKCXU4CWV2ZW50Owp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBidXR0b24gcmVsZWFzZSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3JlbGVhc2VldltdID0gewoJeyAweDAwLCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBqb2dnZXIgZXZlbnRzICAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfam9nZ2VyZXZbXSA9IHsKCXsgMHgxZiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVAgfSwKCXsgMHgwMSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTiB9LAoJeyAweDVmLCBTT05ZUElfRVZFTlRfSk9HRElBTF9VUF9QUkVTU0VEIH0sCgl7IDB4NDEsIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV05fUFJFU1NFRCB9LAoJeyAweDFlLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQIH0sCgl7IDB4MDIsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTiB9LAoJeyAweDVlLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQX1BSRVNTRUQgfSwKCXsgMHg0MiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOX1BSRVNTRUQgfSwKCXsgMHgxZCwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVAgfSwKCXsgMHgwMywgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTiB9LAoJeyAweDVkLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUF9QUkVTU0VEIH0sCgl7IDB4NDMsIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV05fUFJFU1NFRCB9LAoJeyAweDQwLCBTT05ZUElfRVZFTlRfSk9HRElBTF9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBjYXB0dXJlIGJ1dHRvbiBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2NhcHR1cmVldltdID0gewoJeyAweDA1LCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUFJFU1NFRCB9LAoJeyAweDA3LCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VEIH0sCgl7IDB4MDEsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxSRUxFQVNFRCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgZm5rZXlzIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfZm5rZXlldltdID0gewoJeyAweDEwLCBTT05ZUElfRVZFTlRfRk5LRVlfRVNDIH0sCgl7IDB4MTEsIFNPTllQSV9FVkVOVF9GTktFWV9GMSB9LAoJeyAweDEyLCBTT05ZUElfRVZFTlRfRk5LRVlfRjIgfSwKCXsgMHgxMywgU09OWVBJX0VWRU5UX0ZOS0VZX0YzIH0sCgl7IDB4MTQsIFNPTllQSV9FVkVOVF9GTktFWV9GNCB9LAoJeyAweDE1LCBTT05ZUElfRVZFTlRfRk5LRVlfRjUgfSwKCXsgMHgxNiwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2IH0sCgl7IDB4MTcsIFNPTllQSV9FVkVOVF9GTktFWV9GNyB9LAoJeyAweDE4LCBTT05ZUElfRVZFTlRfRk5LRVlfRjggfSwKCXsgMHgxOSwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5IH0sCgl7IDB4MWEsIFNPTllQSV9FVkVOVF9GTktFWV9GMTAgfSwKCXsgMHgxYiwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMSB9LAoJeyAweDFjLCBTT05ZUElfRVZFTlRfRk5LRVlfRjEyIH0sCgl7IDB4MWYsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAoJeyAweDIxLCBTT05ZUElfRVZFTlRfRk5LRVlfMSB9LAoJeyAweDIyLCBTT05ZUElfRVZFTlRfRk5LRVlfMiB9LAoJeyAweDMxLCBTT05ZUElfRVZFTlRfRk5LRVlfRCB9LAoJeyAweDMyLCBTT05ZUElfRVZFTlRfRk5LRVlfRSB9LAoJeyAweDMzLCBTT05ZUElfRVZFTlRfRk5LRVlfRiB9LAoJeyAweDM0LCBTT05ZUElfRVZFTlRfRk5LRVlfUyB9LAoJeyAweDM1LCBTT05ZUElfRVZFTlRfRk5LRVlfQiB9LAoJeyAweDM2LCBTT05ZUElfRVZFTlRfRk5LRVlfT05MWSB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgcHJvZ3JhbSBrZXkgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9wa2V5ZXZbXSA9IHsKCXsgMHgwMSwgU09OWVBJX0VWRU5UX1BLRVlfUDEgfSwKCXsgMHgwMiwgU09OWVBJX0VWRU5UX1BLRVlfUDIgfSwKCXsgMHgwNCwgU09OWVBJX0VWRU5UX1BLRVlfUDMgfSwKCXsgMHg1YywgU09OWVBJX0VWRU5UX1BLRVlfUDEgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJsdWV0b290aCBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JsdWVldltdID0gewoJeyAweDU1LCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQgfSwKCXsgMHg1OSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PTiB9LAoJeyAweDVhLCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09GRiB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgd2lyZWxlc3MgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV93bGVzc2V2W10gPSB7Cgl7IDB4NTksIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PTiB9LAoJeyAweDVhLCBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT0ZGIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBiYWNrIGJ1dHRvbiBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JhY2tldltdID0gewoJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFDS19QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBoZWxwIGJ1dHRvbiBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2hlbHBldltdID0gewoJeyAweDNiLCBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgbGlkIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbGlkZXZbXSA9IHsKCXsgMHg1MSwgU09OWVBJX0VWRU5UX0xJRF9DTE9TRUQgfSwKCXsgMHg1MCwgU09OWVBJX0VWRU5UX0xJRF9PUEVORUQgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIHpvb20gZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV96b29tZXZbXSA9IHsKCXsgMHgzOSwgU09OWVBJX0VWRU5UX1pPT01fUFJFU1NFRCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgdGh1bWJwaHJhc2UgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV90aHVtYnBocmFzZWV2W10gPSB7Cgl7IDB4M2EsIFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBtb3Rpb25leWUgY2FtZXJhIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbWV5ZWV2W10gPSB7Cgl7IDB4MDAsIFNPTllQSV9FVkVOVF9NRVlFX0ZBQ0UgfSwKCXsgMHgwMSwgU09OWVBJX0VWRU5UX01FWUVfT1BQT1NJVEUgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIG1lbW9yeXN0aWNrIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbWVtb3J5c3RpY2tldltdID0gewoJeyAweDUzLCBTT05ZUElfRVZFTlRfTUVNT1JZU1RJQ0tfSU5TRVJUIH0sCgl7IDB4NTQsIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19FSkVDVCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgYmF0dGVyeSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JhdHRlcnlldltdID0gewoJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFUVEVSWV9JTlNFUlQgfSwKCXsgMHgzMCwgU09OWVBJX0VWRU5UX0JBVFRFUllfUkVNT1ZFIH0sCgl7IDAsIDAgfQp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnR0eXBlcyB7CglpbnQJCQltb2RlbDsKCXU4CQkJZGF0YTsKCXVuc2lnbmVkIGxvbmcJCW1hc2s7CglzdHJ1Y3Qgc29ueXBpX2V2ZW50ICoJZXZlbnRzOwp9IHNvbnlwaV9ldmVudHR5cGVzW10gPSB7Cgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDAsIDB4ZmZmZmZmZmYsIHNvbnlwaV9yZWxlYXNlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg3MCwgU09OWVBJX01FWUVfTUFTSywgc29ueXBpX21leWVldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDYwLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MTAsIFNPTllQSV9KT0dHRVJfTUFTSywgc29ueXBpX2pvZ2dlcmV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MjAsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfQkxVRVRPT1RIX01BU0ssIHNvbnlwaV9ibHVlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg0MCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg0MCwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAoKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDM4LCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDExLCBTT05ZUElfSk9HR0VSX01BU0ssIHNvbnlwaV9qb2dnZXJldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDYxLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MjEsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDMxLCBTT05ZUElfQkxVRVRPT1RIX01BU0ssIHNvbnlwaV9ibHVlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgwOCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDExLCBTT05ZUElfQkFDS19NQVNLLCBzb255cGlfYmFja2V2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MjEsIFNPTllQSV9IRUxQX01BU0ssIHNvbnlwaV9oZWxwZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMSwgU09OWVBJX1pPT01fTUFTSywgc29ueXBpX3pvb21ldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDIwLCBTT05ZUElfVEhVTUJQSFJBU0VfTUFTSywgc29ueXBpX3RodW1icGhyYXNlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgzMSwgU09OWVBJX01FTU9SWVNUSUNLX01BU0ssIHNvbnlwaV9tZW1vcnlzdGlja2V2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4NDEsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgzMSwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAoKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMywgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzLCAweDIxLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMywgMHgzMSwgU09OWVBJX1dJUkVMRVNTX01BU0ssIHNvbnlwaV93bGVzc2V2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4MzEsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzLCAweDQxLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4MzEsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKCXsgMCB9Cn07CgojZGVmaW5lIFNPTllQSV9CVUZfU0laRQkxMjgKCi8qIENvcnJlc3BvbmRhbmNlIHRhYmxlIGJldHdlZW4gc29ueXBpIGV2ZW50cyBhbmQgaW5wdXQgbGF5ZXIgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3QgewoJaW50IHNvbnlwaWV2OwoJaW50IGlucHV0ZXY7Cn0gc29ueXBpX2lucHV0a2V5c1tdID0gewoJeyBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VELAkgCUtFWV9DQU1FUkEgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX09OTFksIAkJS0VZX0ZOIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9FU0MsIAkJS0VZX0ZOX0VTQyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjEsIAkJS0VZX0ZOX0YxIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMiwgCQlLRVlfRk5fRjIgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YzLCAJCUtFWV9GTl9GMyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjQsIAkJS0VZX0ZOX0Y0IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GNSwgCQlLRVlfRk5fRjUgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2LCAJCUtFWV9GTl9GNiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjcsIAkJS0VZX0ZOX0Y3IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GOCwgCQlLRVlfRk5fRjggfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5LAkJS0VZX0ZOX0Y5IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMTAsCQlLRVlfRk5fRjEwIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMTEsIAkJS0VZX0ZOX0YxMSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjEyLAkJS0VZX0ZOX0YxMiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfMSwgCQlLRVlfRk5fMSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfMiwgCQlLRVlfRk5fMiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRCwJCQlLRVlfRk5fRCB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRSwJCQlLRVlfRk5fRSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRiwJCQlLRVlfRk5fRiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfUywJCQlLRVlfRk5fUyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfQiwJCQlLRVlfRk5fQiB9LAoJeyBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQsIAlLRVlfQkxVRSB9LAoJeyBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09OLCAJCUtFWV9CTFVFIH0sCgl7IFNPTllQSV9FVkVOVF9QS0VZX1AxLCAJCUtFWV9QUk9HMSB9LAoJeyBTT05ZUElfRVZFTlRfUEtFWV9QMiwgCQlLRVlfUFJPRzIgfSwKCXsgU09OWVBJX0VWRU5UX1BLRVlfUDMsIAkJS0VZX1BST0czIH0sCgl7IFNPTllQSV9FVkVOVF9CQUNLX1BSRVNTRUQsIAkJS0VZX0JBQ0sgfSwKCXsgU09OWVBJX0VWRU5UX0hFTFBfUFJFU1NFRCwgCQlLRVlfSEVMUCB9LAoJeyBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VELCAJCUtFWV9aT09NIH0sCgl7IFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VELCAJQlROX1RIVU1CIH0sCgl7IDAsIDAgfSwKfTsKCnN0cnVjdCBzb255cGlfa2V5cHJlc3MgewoJc3RydWN0IGlucHV0X2RldiAqZGV2OwoJaW50IGtleTsKfTsKCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2RldmljZSB7CglzdHJ1Y3QgcGNpX2RldiAqZGV2OwoJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKCXUxNiBpcnE7Cgl1MTYgYml0czsKCXUxNiBpb3BvcnQxOwoJdTE2IGlvcG9ydDI7Cgl1MTYgcmVnaW9uX3NpemU7Cgl1MTYgZXZ0eXBlX29mZnNldDsKCWludCBjYW1lcmFfcG93ZXI7CglpbnQgYmx1ZXRvb3RoX3Bvd2VyOwoJc3RydWN0IHNlbWFwaG9yZSBsb2NrOwoJc3RydWN0IGtmaWZvICpmaWZvOwoJc3BpbmxvY2tfdCBmaWZvX2xvY2s7Cgl3YWl0X3F1ZXVlX2hlYWRfdCBmaWZvX3Byb2NfbGlzdDsKCXN0cnVjdCBmYXN5bmNfc3RydWN0ICpmaWZvX2FzeW5jOwoJaW50IG9wZW5fY291bnQ7CglpbnQgbW9kZWw7CglzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9qb2dfZGV2OwoJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfa2V5X2RldjsKCXN0cnVjdCB3b3JrX3N0cnVjdCBpbnB1dF93b3JrOwoJc3RydWN0IGtmaWZvICppbnB1dF9maWZvOwoJc3BpbmxvY2tfdCBpbnB1dF9maWZvX2xvY2s7Cn0gc29ueXBpX2RldmljZTsKCiNkZWZpbmUgSVRFUkFUSU9OU19MT05HCQkxMDAwMAojZGVmaW5lIElURVJBVElPTlNfU0hPUlQJMTAKCiNkZWZpbmUgd2FpdF9vbl9jb21tYW5kKHF1aWV0LCBjb21tYW5kLCBpdGVyYXRpb25zKSB7IFwKCXVuc2lnbmVkIGludCBuID0gaXRlcmF0aW9uczsgXAoJd2hpbGUgKC0tbiAmJiAoY29tbWFuZCkpIFwKCQl1ZGVsYXkoMSk7IFwKCWlmICghbiAmJiAodmVyYm9zZSB8fCAhcXVpZXQpKSBcCgkJcHJpbnRrKEtFUk5fV0FSTklORyAic29ueXBpIGNvbW1hbmQgZmFpbGVkIGF0ICVzIDogJXMgKGxpbmUgJWQpXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKfQoKI2lmZGVmIENPTkZJR19BQ1BJCiNkZWZpbmUgU09OWVBJX0FDUElfQUNUSVZFICghYWNwaV9kaXNhYmxlZCkKI2Vsc2UKI2RlZmluZSBTT05ZUElfQUNQSV9BQ1RJVkUgMAojZW5kaWYJCQkJLyogQ09ORklHX0FDUEkgKi8KCnN0YXRpYyBpbnQgc29ueXBpX2VjX3dyaXRlKHU4IGFkZHIsIHU4IHZhbHVlKQp7CiNpZmRlZiBDT05GSUdfQUNQSV9FQwoJaWYgKFNPTllQSV9BQ1BJX0FDVElWRSkKCQlyZXR1cm4gZWNfd3JpdGUoYWRkciwgdmFsdWUpOwojZW5kaWYKCXdhaXRfb25fY29tbWFuZCgxLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAzLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yl9wKDB4ODEsIFNPTllQSV9DU1RfSU9QT1JUKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yl9wKGFkZHIsIFNPTllQSV9EQVRBX0lPUE9SVCk7Cgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3AoU09OWVBJX0NTVF9JT1BPUlQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGJfcCh2YWx1ZSwgU09OWVBJX0RBVEFfSU9QT1JUKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX2VjX3JlYWQodTggYWRkciwgdTggKnZhbHVlKQp7CiNpZmRlZiBDT05GSUdfQUNQSV9FQwoJaWYgKFNPTllQSV9BQ1BJX0FDVElWRSkKCQlyZXR1cm4gZWNfcmVhZChhZGRyLCB2YWx1ZSk7CiNlbmRpZgoJd2FpdF9vbl9jb21tYW5kKDEsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDMsIElURVJBVElPTlNfTE9ORyk7CglvdXRiX3AoMHg4MCwgU09OWVBJX0NTVF9JT1BPUlQpOwoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiX3AoYWRkciwgU09OWVBJX0RBVEFfSU9QT1JUKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJKnZhbHVlID0gaW5iX3AoU09OWVBJX0RBVEFfSU9QT1JUKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGVjX3JlYWQxNih1OCBhZGRyLCB1MTYgKnZhbHVlKQp7Cgl1OCB2YWxfbGIsIHZhbF9oYjsKCWlmIChzb255cGlfZWNfcmVhZChhZGRyLCAmdmFsX2xiKSkKCQlyZXR1cm4gLTE7CglpZiAoc29ueXBpX2VjX3JlYWQoYWRkciArIDEsICZ2YWxfaGIpKQoJCXJldHVybiAtMTsKCSp2YWx1ZSA9IHZhbF9sYiB8ICh2YWxfaGIgPDwgOCk7CglyZXR1cm4gMDsKfQoKLyogSW5pdGlhbGl6ZXMgdGhlIGRldmljZSAtIHRoaXMgY29tZXMgZnJvbSB0aGUgQU1MIGNvZGUgaW4gdGhlIEFDUEkgYmlvcyAqLwpzdGF0aWMgdm9pZCBzb255cGlfdHlwZTFfc3JzKHZvaWQpCnsKCXUzMiB2OwoKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsICZ2KTsKCXYgPSAodiAmIDB4RkZGRjAwMDApIHwgKCh1MzIpIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgdik7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgJnYpOwoJdiA9ICh2ICYgMHhGRkYwRkZGRikgfAoJICAgICgoKHUzMikgc29ueXBpX2RldmljZS5pb3BvcnQxIF4gc29ueXBpX2RldmljZS5pb3BvcnQyKSA8PCAxNik7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgdik7CgoJdiA9IGlubChTT05ZUElfSVJRX1BPUlQpOwoJdiAmPSB+KCgodTMyKSAweDMpIDw8IFNPTllQSV9JUlFfU0hJRlQpOwoJdiB8PSAoKCh1MzIpIHNvbnlwaV9kZXZpY2UuYml0cykgPDwgU09OWVBJX0lSUV9TSElGVCk7CglvdXRsKHYsIFNPTllQSV9JUlFfUE9SVCk7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgJnYpOwoJdiA9ICh2ICYgMHhGRjFGRkZGRikgfCAweDAwQzAwMDAwOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsIHYpOwp9CgpzdGF0aWMgdm9pZCBzb255cGlfdHlwZTJfc3JzKHZvaWQpCnsKCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX1NISUIsIChzb255cGlfZGV2aWNlLmlvcG9ydDEgJiAweEZGMDApID4+IDgpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7CglpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TTE9CLCBzb255cGlfZGV2aWNlLmlvcG9ydDEgJiAweDAwRkYpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7CglpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TSVJRLCBzb255cGlfZGV2aWNlLmJpdHMpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7Cgl1ZGVsYXkoMTApOwp9CgpzdGF0aWMgdm9pZCBzb255cGlfdHlwZTNfc3JzKHZvaWQpCnsKCXUxNiB2MTY7Cgl1OCAgdjg7CgoJLyogVGhpcyBtb2RlbCB0eXBlIHVzZXMgdGhlIHNhbWUgaW5pdGlhbGlhemF0aW9uIG9mCgkgKiB0aGUgZW1iZWRkZWQgY29udHJvbGxlciBhcyB0aGUgdHlwZTIgbW9kZWxzLiAqLwoJc29ueXBpX3R5cGUyX3NycygpOwoKCS8qIEluaXRpYWxpemF0aW9uIG9mIFBDSSBjb25maWcgc3BhY2Ugb2YgdGhlIExQQyBpbnRlcmZhY2UgYnJpZGdlLiAqLwoJdjE2ID0gKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSAmIDB4RkZGMCkgfCAweDAxOwoJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfVFlQRTNfR0lEMiwgdjE2KTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfVFlQRTNfTUlTQywgJnY4KTsKCXY4ID0gKHY4ICYgMHhDRikgfCAweDEwOwoJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfVFlQRTNfTUlTQywgdjgpOwp9CgovKiBEaXNhYmxlcyB0aGUgZGV2aWNlIC0gdGhpcyBjb21lcyBmcm9tIHRoZSBBTUwgY29kZSBpbiB0aGUgQUNQSSBiaW9zICovCnN0YXRpYyB2b2lkIHNvbnlwaV90eXBlMV9kaXModm9pZCkKewoJdTMyIHY7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgJnYpOwoJdiA9IHYgJiAweEZGM0ZGRkZGOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsIHYpOwoKCXYgPSBpbmwoU09OWVBJX0lSUV9QT1JUKTsKCXYgfD0gKDB4MyA8PCBTT05ZUElfSVJRX1NISUZUKTsKCW91dGwodiwgU09OWVBJX0lSUV9QT1JUKTsKfQoKc3RhdGljIHZvaWQgc29ueXBpX3R5cGUyX2Rpcyh2b2lkKQp7CglpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TSElCLCAwKSkKCQlwcmludGsoS0VSTl9XQVJOSU5HICJlY193cml0ZSBmYWlsZWRcbiIpOwoJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0xPQiwgMCkpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX1NJUlEsIDApKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7Cn0KCnN0YXRpYyB2b2lkIHNvbnlwaV90eXBlM19kaXModm9pZCkKewoJc29ueXBpX3R5cGUyX2RpcygpOwoJdWRlbGF5KDEwKTsKCXBjaV93cml0ZV9jb25maWdfd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX1RZUEUzX0dJRDIsIDApOwp9CgpzdGF0aWMgdTggc29ueXBpX2NhbGwxKHU4IGRldikKewoJdTggdjEsIHYyOwoKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZGV2LCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJdjEgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJdjIgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDEpOwoJcmV0dXJuIHYyOwp9CgpzdGF0aWMgdTggc29ueXBpX2NhbGwyKHU4IGRldiwgdTggZm4pCnsKCXU4IHYxOwoKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZGV2LCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MikgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yihmbiwgc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXYxID0gaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXJldHVybiB2MTsKfQoKc3RhdGljIHU4IHNvbnlwaV9jYWxsMyh1OCBkZXYsIHU4IGZuLCB1OCB2KQp7Cgl1OCB2MTsKCgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiKGRldiwgc29ueXBpX2RldmljZS5pb3BvcnQyKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZm4sIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7Cgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiKHYsIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7Cgl2MSA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7CglyZXR1cm4gdjE7Cn0KCiNpZiAwCi8qIEdldCBicmlnaHRuZXNzLCBodWUgZXRjLiBVbnJlbGlhYmxlLi4uICovCnN0YXRpYyB1OCBzb255cGlfcmVhZCh1OCBmbikKewoJdTggdjEsIHYyOwoJaW50IG4gPSAxMDA7CgoJd2hpbGUgKG4tLSkgewoJCXYxID0gc29ueXBpX2NhbGwyKDB4OGYsIGZuKTsKCQl2MiA9IHNvbnlwaV9jYWxsMigweDhmLCBmbik7CgkJaWYgKHYxID09IHYyICYmIHYxICE9IDB4ZmYpCgkJCXJldHVybiB2MTsKCX0KCXJldHVybiAweGZmOwp9CiNlbmRpZgoKLyogU2V0IGJyaWdodG5lc3MsIGh1ZSBldGMgKi8Kc3RhdGljIHZvaWQgc29ueXBpX3NldCh1OCBmbiwgdTggdikKewoJd2FpdF9vbl9jb21tYW5kKDAsIHNvbnlwaV9jYWxsMygweDkwLCBmbiwgdiksIElURVJBVElPTlNfU0hPUlQpOwp9CgovKiBUZXN0cyBpZiB0aGUgY2FtZXJhIGlzIHJlYWR5ICovCnN0YXRpYyBpbnQgc29ueXBpX2NhbWVyYV9yZWFkeSh2b2lkKQp7Cgl1OCB2OwoKCXYgPSBzb255cGlfY2FsbDIoMHg4ZiwgU09OWVBJX0NBTUVSQV9TVEFUVVMpOwoJcmV0dXJuICh2ICE9IDB4ZmYgJiYgKHYgJiBTT05ZUElfQ0FNRVJBX1NUQVRVU19SRUFEWSkpOwp9CgovKiBUdXJucyB0aGUgY2FtZXJhIG9mZiAqLwpzdGF0aWMgdm9pZCBzb255cGlfY2FtZXJhX29mZih2b2lkKQp7Cglzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfUElDVFVSRSwgU09OWVBJX0NBTUVSQV9NVVRFX01BU0spOwoKCWlmICghc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXIpCgkJcmV0dXJuOwoKCXNvbnlwaV9jYWxsMigweDkxLCAwKTsKCXNvbnlwaV9kZXZpY2UuY2FtZXJhX3Bvd2VyID0gMDsKfQoKLyogVHVybnMgdGhlIGNhbWVyYSBvbiAqLwpzdGF0aWMgdm9pZCBzb255cGlfY2FtZXJhX29uKHZvaWQpCnsKCWludCBpLCBqOwoKCWlmIChzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlcikKCQlyZXR1cm47CgoJZm9yIChqID0gNTsgaiA+IDA7IGotLSkgewoKCQl3aGlsZSAoc29ueXBpX2NhbGwyKDB4OTEsIDB4MSkpCgkJCW1zbGVlcCgxMCk7CgkJc29ueXBpX2NhbGwxKDB4OTMpOwoKCQlmb3IgKGkgPSA0MDA7IGkgPiAwOyBpLS0pIHsKCQkJaWYgKHNvbnlwaV9jYW1lcmFfcmVhZHkoKSkKCQkJCWJyZWFrOwoJCQltc2xlZXAoMTApOwoJCX0KCQlpZiAoaSkKCQkJYnJlYWs7Cgl9CgoJaWYgKGogPT0gMCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgInNvbnlwaTogZmFpbGVkIHRvIHBvd2VyIG9uIGNhbWVyYVxuIik7CgkJcmV0dXJuOwoJfQoKCXNvbnlwaV9zZXQoMHgxMCwgMHg1YSk7Cglzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlciA9IDE7Cn0KCi8qIHNldHMgdGhlIGJsdWV0b290aCBzdWJzeXN0ZW0gcG93ZXIgc3RhdGUgKi8Kc3RhdGljIHZvaWQgc29ueXBpX3NldGJsdWV0b290aHBvd2VyKHU4IHN0YXRlKQp7CglzdGF0ZSA9ICEhc3RhdGU7CgoJaWYgKHNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyID09IHN0YXRlKQoJCXJldHVybjsKCglzb255cGlfY2FsbDIoMHg5Niwgc3RhdGUpOwoJc29ueXBpX2NhbGwxKDB4ODIpOwoJc29ueXBpX2RldmljZS5ibHVldG9vdGhfcG93ZXIgPSBzdGF0ZTsKfQoKc3RhdGljIHZvaWQgaW5wdXRfa2V5cmVsZWFzZSh2b2lkICpkYXRhKQp7CglzdHJ1Y3Qgc29ueXBpX2tleXByZXNzIGtwOwoKCXdoaWxlIChrZmlmb19nZXQoc29ueXBpX2RldmljZS5pbnB1dF9maWZvLCAodW5zaWduZWQgY2hhciAqKSZrcCwKCQkJIHNpemVvZihrcCkpID09IHNpemVvZihrcCkpIHsKCQltc2xlZXAoMTApOwoJCWlucHV0X3JlcG9ydF9rZXkoa3AuZGV2LCBrcC5rZXksIDApOwoJCWlucHV0X3N5bmMoa3AuZGV2KTsKCX0KfQoKc3RhdGljIHZvaWQgc29ueXBpX3JlcG9ydF9pbnB1dF9ldmVudCh1OCBldmVudCkKewoJc3RydWN0IGlucHV0X2RldiAqam9nX2RldiA9IHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2RldjsKCXN0cnVjdCBpbnB1dF9kZXYgKmtleV9kZXYgPSBzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXY7CglzdHJ1Y3Qgc29ueXBpX2tleXByZXNzIGtwID0geyBOVUxMIH07CglpbnQgaTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQOgoJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9VUF9QUkVTU0VEOgoJCWlucHV0X3JlcG9ydF9yZWwoam9nX2RldiwgUkVMX1dIRUVMLCAxKTsKCQlpbnB1dF9zeW5jKGpvZ19kZXYpOwoJCWJyZWFrOwoKCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTjoKCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTl9QUkVTU0VEOgoJCWlucHV0X3JlcG9ydF9yZWwoam9nX2RldiwgUkVMX1dIRUVMLCAtMSk7CgkJaW5wdXRfc3luYyhqb2dfZGV2KTsKCQlicmVhazsKCgljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1BSRVNTRUQ6CgkJa3Aua2V5ID0gQlROX01JRERMRTsKCQlrcC5kZXYgPSBqb2dfZGV2OwoJCWJyZWFrOwoKCWNhc2UgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEOgoJCS8qIE5vdGhpbmcsIG5vdCBhbGwgVkFJT3MgZ2VuZXJhdGUgdGhpcyBldmVudCAqLwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJZm9yIChpID0gMDsgc29ueXBpX2lucHV0a2V5c1tpXS5zb255cGlldjsgaSsrKQoJCQlpZiAoZXZlbnQgPT0gc29ueXBpX2lucHV0a2V5c1tpXS5zb255cGlldikgewoJCQkJa3AuZGV2ID0ga2V5X2RldjsKCQkJCWtwLmtleSA9IHNvbnlwaV9pbnB1dGtleXNbaV0uaW5wdXRldjsKCQkJCWJyZWFrOwoJCQl9CgkJYnJlYWs7Cgl9CgoJaWYgKGtwLmRldikgewoJCWlucHV0X3JlcG9ydF9rZXkoa3AuZGV2LCBrcC5rZXksIDEpOwoJCWlucHV0X3N5bmMoa3AuZGV2KTsKCQlrZmlmb19wdXQoc29ueXBpX2RldmljZS5pbnB1dF9maWZvLAoJCQkgICh1bnNpZ25lZCBjaGFyICopJmtwLCBzaXplb2Yoa3ApKTsKCQlzY2hlZHVsZV93b3JrKCZzb255cGlfZGV2aWNlLmlucHV0X3dvcmspOwoJfQp9CgovKiBJbnRlcnJ1cHQgaGFuZGxlcjogc29tZSBldmVudCBpcyBhdmFpbGFibGUgKi8Kc3RhdGljIGlycXJldHVybl90IHNvbnlwaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJdTggdjEsIHYyLCBldmVudCA9IDA7CglpbnQgaSwgajsKCgl2MSA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7Cgl2MiA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSArIHNvbnlwaV9kZXZpY2UuZXZ0eXBlX29mZnNldCk7CgoJZm9yIChpID0gMDsgc29ueXBpX2V2ZW50dHlwZXNbaV0ubW9kZWw7IGkrKykgewoJCWlmIChzb255cGlfZGV2aWNlLm1vZGVsICE9IHNvbnlwaV9ldmVudHR5cGVzW2ldLm1vZGVsKQoJCQljb250aW51ZTsKCQlpZiAoKHYyICYgc29ueXBpX2V2ZW50dHlwZXNbaV0uZGF0YSkgIT0KCQkgICAgc29ueXBpX2V2ZW50dHlwZXNbaV0uZGF0YSkKCQkJY29udGludWU7CgkJaWYgKCEobWFzayAmIHNvbnlwaV9ldmVudHR5cGVzW2ldLm1hc2spKQoJCQljb250aW51ZTsKCQlmb3IgKGogPSAwOyBzb255cGlfZXZlbnR0eXBlc1tpXS5ldmVudHNbal0uZXZlbnQ7IGorKykgewoJCQlpZiAodjEgPT0gc29ueXBpX2V2ZW50dHlwZXNbaV0uZXZlbnRzW2pdLmRhdGEpIHsKCQkJCWV2ZW50ID0gc29ueXBpX2V2ZW50dHlwZXNbaV0uZXZlbnRzW2pdLmV2ZW50OwoJCQkJZ290byBmb3VuZDsKCQkJfQoJCX0KCX0KCglpZiAodmVyYm9zZSkKCQlwcmludGsoS0VSTl9XQVJOSU5HCgkJICAgICAgICJzb255cGk6IHVua25vd24gZXZlbnQgcG9ydDE9MHglMDJ4LHBvcnQyPTB4JTAyeFxuIiwKCQkgICAgICAgdjEsIHYyKTsKCS8qIFdlIG5lZWQgdG8gcmV0dXJuIElSUV9IQU5ETEVEIGhlcmUgYmVjYXVzZSB0aGVyZSAqYXJlKgoJICogZXZlbnRzIGJlbG9uZ2luZyB0byB0aGUgc29ueXBpIGRldmljZSB3ZSBkb24ndCBrbm93IGFib3V0LAoJICogYnV0IHdlIHN0aWxsIGRvbid0IHdhbnQgdGhvc2UgdG8gcG9sbHV0ZSB0aGUgbG9ncy4uLiAqLwoJcmV0dXJuIElSUV9IQU5ETEVEOwoKZm91bmQ6CglpZiAodmVyYm9zZSA+IDEpCgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAic29ueXBpOiBldmVudCBwb3J0MT0weCUwMngscG9ydDI9MHglMDJ4XG4iLCB2MSwgdjIpOwoKCWlmICh1c2VpbnB1dCkKCQlzb255cGlfcmVwb3J0X2lucHV0X2V2ZW50KGV2ZW50KTsKCglrZmlmb19wdXQoc29ueXBpX2RldmljZS5maWZvLCAodW5zaWduZWQgY2hhciAqKSZldmVudCwgc2l6ZW9mKGV2ZW50KSk7CglraWxsX2Zhc3luYygmc29ueXBpX2RldmljZS5maWZvX2FzeW5jLCBTSUdJTywgUE9MTF9JTik7Cgl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNvbnlwaV9kZXZpY2UuZmlmb19wcm9jX2xpc3QpOwoKCXJldHVybiBJUlFfSEFORExFRDsKfQoKLyogRXh0ZXJuYWwgY2FtZXJhIGNvbW1hbmQgKGV4cG9ydGVkIHRvIHRoZSBtb3Rpb24gZXllIHY0bCBkcml2ZXIpICovCmludCBzb255cGlfY2FtZXJhX2NvbW1hbmQoaW50IGNvbW1hbmQsIHU4IHZhbHVlKQp7CglpZiAoIWNhbWVyYSkKCQlyZXR1cm4gLUVJTzsKCglkb3duKCZzb255cGlfZGV2aWNlLmxvY2spOwoKCXN3aXRjaCAoY29tbWFuZCkgewoJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkE6CgkJaWYgKHZhbHVlKQoJCQlzb255cGlfY2FtZXJhX29uKCk7CgkJZWxzZQoJCQlzb255cGlfY2FtZXJhX29mZigpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFCUklHSFRORVNTOgoJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9CUklHSFRORVNTLCB2YWx1ZSk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTlRSQVNUOgoJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9DT05UUkFTVCwgdmFsdWUpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFIVUU6CgkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0hVRSwgdmFsdWUpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFDT0xPUjoKCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQ09MT1IsIHZhbHVlKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBU0hBUlBORVNTOgoJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9TSEFSUE5FU1MsIHZhbHVlKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBUElDVFVSRToKCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfUElDVFVSRSwgdmFsdWUpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFBR0M6CgkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0FHQywgdmFsdWUpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogc29ueXBpX2NhbWVyYV9jb21tYW5kIGludmFsaWQ6ICVkXG4iLAoJCSAgICAgICBjb21tYW5kKTsKCQlicmVhazsKCX0KCXVwKCZzb255cGlfZGV2aWNlLmxvY2spOwoJcmV0dXJuIDA7Cn0KCkVYUE9SVF9TWU1CT0woc29ueXBpX2NhbWVyYV9jb21tYW5kKTsKCnN0YXRpYyBpbnQgc29ueXBpX21pc2NfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKewoJaW50IHJldHZhbDsKCglyZXR2YWwgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCBvbiwgJnNvbnlwaV9kZXZpY2UuZmlmb19hc3luYyk7CglpZiAocmV0dmFsIDwgMCkKCQlyZXR1cm4gcmV0dmFsOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX21pc2NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc29ueXBpX21pc2NfZmFzeW5jKC0xLCBmaWxlLCAwKTsKCWRvd24oJnNvbnlwaV9kZXZpY2UubG9jayk7Cglzb255cGlfZGV2aWNlLm9wZW5fY291bnQtLTsKCXVwKCZzb255cGlfZGV2aWNlLmxvY2spOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX21pc2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJZG93bigmc29ueXBpX2RldmljZS5sb2NrKTsKCS8qIEZsdXNoIGlucHV0IHF1ZXVlIG9uIGZpcnN0IG9wZW4gKi8KCWlmICghc29ueXBpX2RldmljZS5vcGVuX2NvdW50KQoJCWtmaWZvX3Jlc2V0KHNvbnlwaV9kZXZpY2UuZmlmbyk7Cglzb255cGlfZGV2aWNlLm9wZW5fY291bnQrKzsKCXVwKCZzb255cGlfZGV2aWNlLmxvY2spOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzc2l6ZV90IHNvbnlwaV9taXNjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCgkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQp7Cglzc2l6ZV90IHJldDsKCXVuc2lnbmVkIGNoYXIgYzsKCglpZiAoKGtmaWZvX2xlbihzb255cGlfZGV2aWNlLmZpZm8pID09IDApICYmCgkgICAgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKCQlyZXR1cm4gLUVBR0FJTjsKCglyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc29ueXBpX2RldmljZS5maWZvX3Byb2NfbGlzdCwKCQkJCSAgICAgICBrZmlmb19sZW4oc29ueXBpX2RldmljZS5maWZvKSAhPSAwKTsKCWlmIChyZXQpCgkJcmV0dXJuIHJldDsKCgl3aGlsZSAocmV0IDwgY291bnQgJiYKCSAgICAgICAoa2ZpZm9fZ2V0KHNvbnlwaV9kZXZpY2UuZmlmbywgJmMsIHNpemVvZihjKSkgPT0gc2l6ZW9mKGMpKSkgewoJCWlmIChwdXRfdXNlcihjLCBidWYrKykpCgkJCXJldHVybiAtRUZBVUxUOwoJCXJldCsrOwoJfQoKCWlmIChyZXQgPiAwKSB7CgkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwoJCWlub2RlLT5pX2F0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKCX0KCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdW5zaWduZWQgaW50IHNvbnlwaV9taXNjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCnsKCXBvbGxfd2FpdChmaWxlLCAmc29ueXBpX2RldmljZS5maWZvX3Byb2NfbGlzdCwgd2FpdCk7CglpZiAoa2ZpZm9fbGVuKHNvbnlwaV9kZXZpY2UuZmlmbykpCgkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzb255cGlfbWlzY19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsCgkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCWludCByZXQgPSAwOwoJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Cgl1OCB2YWw4OwoJdTE2IHZhbDE2OwoKCWRvd24oJnNvbnlwaV9kZXZpY2UubG9jayk7Cglzd2l0Y2ggKGNtZCkgewoJY2FzZSBTT05ZUElfSU9DR0JSVDoKCQlpZiAoc29ueXBpX2VjX3JlYWQoU09OWVBJX0xDRF9MSUdIVCwgJnZhbDgpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DU0JSVDoKCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbDgsIGFyZ3AsIHNpemVvZih2YWw4KSkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX0xDRF9MSUdIVCwgdmFsOCkpCgkJCXJldCA9IC1FSU87CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NHQkFUMUNBUDoKCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQxX0ZVTEwsICZ2YWwxNikpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ0dCQVQxUkVNOgoJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDFfTEVGVCwgJnZhbDE2KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JBVDJDQVA6CgkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMl9GVUxMLCAmdmFsMTYpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NHQkFUMlJFTToKCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQyX0xFRlQsICZ2YWwxNikpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ0dCQVRGTEFHUzoKCQlpZiAoc29ueXBpX2VjX3JlYWQoU09OWVBJX0JBVF9GTEFHUywgJnZhbDgpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQl2YWw4ICY9IDB4MDc7CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ0dCTFVFOgoJCXZhbDggPSBzb255cGlfZGV2aWNlLmJsdWV0b290aF9wb3dlcjsKCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DU0JMVUU6CgkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlzb255cGlfc2V0Ymx1ZXRvb3RocG93ZXIodmFsOCk7CgkJYnJlYWs7CgkvKiBGQU4gQ29udHJvbHMgKi8KCWNhc2UgU09OWVBJX0lPQ0dGQU46CgkJaWYgKHNvbnlwaV9lY19yZWFkKFNPTllQSV9GQU4wX1NUQVRVUywgJnZhbDgpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DU0ZBTjoKCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbDgsIGFyZ3AsIHNpemVvZih2YWw4KSkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX0ZBTjBfU1RBVFVTLCB2YWw4KSkKCQkJcmV0ID0gLUVJTzsKCQlicmVhazsKCS8qIEdFVCBUZW1wZXJhdHVyZSAodXNlZnVsIHVuZGVyIEFQTSkgKi8KCWNhc2UgU09OWVBJX0lPQ0dURU1QOgoJCWlmIChzb255cGlfZWNfcmVhZChTT05ZUElfVEVNUF9TVEFUVVMsICZ2YWw4KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0ID0gLUVJTlZBTDsKCX0KCXVwKCZzb255cGlfZGV2aWNlLmxvY2spOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29ueXBpX21pc2NfZm9wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5yZWFkCQk9IHNvbnlwaV9taXNjX3JlYWQsCgkucG9sbAkJPSBzb255cGlfbWlzY19wb2xsLAoJLm9wZW4JCT0gc29ueXBpX21pc2Nfb3BlbiwKCS5yZWxlYXNlCT0gc29ueXBpX21pc2NfcmVsZWFzZSwKCS5mYXN5bmMJCT0gc29ueXBpX21pc2NfZmFzeW5jLAoJLmlvY3RsCQk9IHNvbnlwaV9taXNjX2lvY3RsLAp9OwoKc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHNvbnlwaV9taXNjX2RldmljZSA9IHsKCS5taW5vcgkJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCgkubmFtZQkJPSAic29ueXBpIiwKCS5mb3BzCQk9ICZzb255cGlfbWlzY19mb3BzLAp9OwoKc3RhdGljIHZvaWQgc29ueXBpX2VuYWJsZSh1bnNpZ25lZCBpbnQgY2FtZXJhX29uKQp7Cglzd2l0Y2ggKHNvbnlwaV9kZXZpY2UubW9kZWwpIHsKCWNhc2UgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMToKCQlzb255cGlfdHlwZTFfc3JzKCk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTI6CgkJc29ueXBpX3R5cGUyX3NycygpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzOgoJCXNvbnlwaV90eXBlM19zcnMoKTsKCQlicmVhazsKCX0KCglzb255cGlfY2FsbDEoMHg4Mik7Cglzb255cGlfY2FsbDIoMHg4MSwgMHhmZik7Cglzb255cGlfY2FsbDEoY29tcGF0ID8gMHg5MiA6IDB4ODIpOwoKCS8qIEVuYWJsZSBBQ1BJIG1vZGUgdG8gZ2V0IEZuIGtleSBldmVudHMgKi8KCWlmICghU09OWVBJX0FDUElfQUNUSVZFICYmIGZua2V5aW5pdCkKCQlvdXRiKDB4ZjAsIDB4YjIpOwoKCWlmIChjYW1lcmEgJiYgY2FtZXJhX29uKQoJCXNvbnlwaV9jYW1lcmFfb24oKTsKfQoKc3RhdGljIGludCBzb255cGlfZGlzYWJsZSh2b2lkKQp7Cglzb255cGlfY2FsbDIoMHg4MSwgMCk7CS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IG1vcmUgZXZlbnRzICovCglpZiAoY2FtZXJhKQoJCXNvbnlwaV9jYW1lcmFfb2ZmKCk7CgoJLyogZGlzYWJsZSBBQ1BJIG1vZGUgKi8KCWlmICghU09OWVBJX0FDUElfQUNUSVZFICYmIGZua2V5aW5pdCkKCQlvdXRiKDB4ZjEsIDB4YjIpOwoKCXN3aXRjaCAoc29ueXBpX2RldmljZS5tb2RlbCkgewoJY2FzZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxOgoJCXNvbnlwaV90eXBlMV9kaXMoKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMjoKCQlzb255cGlfdHlwZTJfZGlzKCk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTM6CgkJc29ueXBpX3R5cGUzX2RpcygpOwoJCWJyZWFrOwoJfQoKCXJldHVybiAwOwp9CgojaWZkZWYgQ09ORklHX1BNCnN0YXRpYyBpbnQgb2xkX2NhbWVyYV9wb3dlcjsKCnN0YXRpYyBpbnQgc29ueXBpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKCW9sZF9jYW1lcmFfcG93ZXIgPSBzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlcjsKCXNvbnlwaV9kaXNhYmxlKCk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCXNvbnlwaV9lbmFibGUob2xkX2NhbWVyYV9wb3dlcik7CglyZXR1cm4gMDsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIHNvbnlwaV9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCXNvbnlwaV9kaXNhYmxlKCk7Cn0KCnN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzb255cGlfZHJpdmVyID0gewoJLm5hbWUJCT0gInNvbnlwaSIsCgkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKI2lmZGVmIENPTkZJR19QTQoJLnN1c3BlbmQJPSBzb255cGlfc3VzcGVuZCwKCS5yZXN1bWUJCT0gc29ueXBpX3Jlc3VtZSwKI2VuZGlmCgkuc2h1dGRvd24JPSBzb255cGlfc2h1dGRvd24sCn07CgpzdGF0aWMgaW50IF9fZGV2aW5pdCBzb255cGlfY3JlYXRlX2lucHV0X2RldmljZXModm9pZCkKewoJc3RydWN0IGlucHV0X2RldiAqam9nX2RldjsKCXN0cnVjdCBpbnB1dF9kZXYgKmtleV9kZXY7CglpbnQgaTsKCglzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYgPSBqb2dfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CglpZiAoIWpvZ19kZXYpCgkJcmV0dXJuIC1FTk9NRU07CgoJam9nX2Rldi0+bmFtZSA9ICJTb255IFZhaW8gSm9nZGlhbCI7Cglqb2dfZGV2LT5pZC5idXN0eXBlID0gQlVTX0lTQTsKCWpvZ19kZXYtPmlkLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfU09OWTsKCglqb2dfZGV2LT5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX1JFTCk7Cglqb2dfZGV2LT5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSA9IEJJVChCVE5fTUlERExFKTsKCWpvZ19kZXYtPnJlbGJpdFswXSA9IEJJVChSRUxfV0hFRUwpOwoKCXNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2RldiA9IGtleV9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKCWlmICgha2V5X2RldikgewoJCWlucHV0X2ZyZWVfZGV2aWNlKGpvZ19kZXYpOwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2RldiA9IE5VTEw7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJa2V5X2Rldi0+bmFtZSA9ICJTb255IFZhaW8gS2V5cyI7CglrZXlfZGV2LT5pZC5idXN0eXBlID0gQlVTX0lTQTsKCWtleV9kZXYtPmlkLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfU09OWTsKCgkvKiBJbml0aWFsaXplIHRoZSBJbnB1dCBEcml2ZXJzOiBzcGVjaWFsIGtleXMgKi8KCWtleV9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSk7Cglmb3IgKGkgPSAwOyBzb255cGlfaW5wdXRrZXlzW2ldLnNvbnlwaWV2OyBpKyspCgkJaWYgKHNvbnlwaV9pbnB1dGtleXNbaV0uaW5wdXRldikKCQkJc2V0X2JpdChzb255cGlfaW5wdXRrZXlzW2ldLmlucHV0ZXYsIGtleV9kZXYtPmtleWJpdCk7CgoJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGpvZ19kZXYpOwoJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGtleV9kZXYpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IF9fZGV2aW5pdCBzb255cGlfcHJvYmUodm9pZCkKewoJaW50IGksIHJldDsKCXN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3QgKmlvcG9ydF9saXN0OwoJc3RydWN0IHNvbnlwaV9pcnFfbGlzdCAqaXJxX2xpc3Q7CglzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OwoKCWlmICgocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKCQkJCSAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIE5VTEwpKSkKCQlzb255cGlfZGV2aWNlLm1vZGVsID0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMTsKCWVsc2UgaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAoJCQkJCSAgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzEsIE5VTEwpKSkKCQlzb255cGlfZGV2aWNlLm1vZGVsID0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMzsKCWVsc2UKCQlzb255cGlfZGV2aWNlLm1vZGVsID0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMjsKCglzb255cGlfZGV2aWNlLmRldiA9IHBjaWRldjsKCglzcGluX2xvY2tfaW5pdCgmc29ueXBpX2RldmljZS5maWZvX2xvY2spOwoJc29ueXBpX2RldmljZS5maWZvID0ga2ZpZm9fYWxsb2MoU09OWVBJX0JVRl9TSVpFLCBHRlBfS0VSTkVMLAoJCQkJCSAmc29ueXBpX2RldmljZS5maWZvX2xvY2spOwoJaWYgKElTX0VSUihzb255cGlfZGV2aWNlLmZpZm8pKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IGtmaWZvX2FsbG9jIGZhaWxlZFxuIik7CgkJcmV0ID0gUFRSX0VSUihzb255cGlfZGV2aWNlLmZpZm8pOwoJCWdvdG8gb3V0X2ZpZm87Cgl9CgoJaW5pdF93YWl0cXVldWVfaGVhZCgmc29ueXBpX2RldmljZS5maWZvX3Byb2NfbGlzdCk7Cglpbml0X01VVEVYKCZzb255cGlfZGV2aWNlLmxvY2spOwoJc29ueXBpX2RldmljZS5ibHVldG9vdGhfcG93ZXIgPSAtMTsKCglpZiAocGNpZGV2ICYmIHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpIHsKCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkXG4iKTsKCQlyZXQgPSAtRUlPOwoJCWdvdG8gb3V0X3BjaWVuYWJsZTsKCX0KCglpZiAobWlub3IgIT0gLTEpCgkJc29ueXBpX21pc2NfZGV2aWNlLm1pbm9yID0gbWlub3I7CglpZiAoKHJldCA9IG1pc2NfcmVnaXN0ZXIoJnNvbnlwaV9taXNjX2RldmljZSkpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IG1pc2NfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKCQlnb3RvIG91dF9taXNjcmVnOwoJfQoKCglpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxKSB7CgkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTFfaW9wb3J0X2xpc3Q7CgkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFMV9SRUdJT05fU0laRTsKCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTFfRVZUWVBFX09GRlNFVDsKCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlMV9pcnFfbGlzdDsKCX0gZWxzZSBpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyKSB7CgkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTJfaW9wb3J0X2xpc3Q7CgkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFMl9SRUdJT05fU0laRTsKCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTJfRVZUWVBFX09GRlNFVDsKCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlMl9pcnFfbGlzdDsKCX0gZWxzZSB7CgkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTNfaW9wb3J0X2xpc3Q7CgkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFM19SRUdJT05fU0laRTsKCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTNfRVZUWVBFX09GRlNFVDsKCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlM19pcnFfbGlzdDsKCX0KCglmb3IgKGkgPSAwOyBpb3BvcnRfbGlzdFtpXS5wb3J0MTsgaSsrKSB7CgkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvcG9ydF9saXN0W2ldLnBvcnQxLAoJCQkJICAgc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSwKCQkJCSAgICJTb255IFByb2dyYW1hYmxlIEkvTyBEZXZpY2UiKSkgewoJCQkvKiBnZXQgdGhlIGlvcG9ydCAqLwoJCQlzb255cGlfZGV2aWNlLmlvcG9ydDEgPSBpb3BvcnRfbGlzdFtpXS5wb3J0MTsKCQkJc29ueXBpX2RldmljZS5pb3BvcnQyID0gaW9wb3J0X2xpc3RbaV0ucG9ydDI7CgkJCWJyZWFrOwoJCX0KCX0KCWlmICghc29ueXBpX2RldmljZS5pb3BvcnQxKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IHJlcXVlc3RfcmVnaW9uIGZhaWxlZFxuIik7CgkJcmV0ID0gLUVOT0RFVjsKCQlnb3RvIG91dF9yZXFyZWc7Cgl9CgoJZm9yIChpID0gMDsgaXJxX2xpc3RbaV0uaXJxOyBpKyspIHsKCgkJc29ueXBpX2RldmljZS5pcnEgPSBpcnFfbGlzdFtpXS5pcnE7CgkJc29ueXBpX2RldmljZS5iaXRzID0gaXJxX2xpc3RbaV0uYml0czsKCgkJaWYgKCFyZXF1ZXN0X2lycShzb255cGlfZGV2aWNlLmlycSwgc29ueXBpX2lycSwKCQkJCSBTQV9TSElSUSwgInNvbnlwaSIsIHNvbnlwaV9pcnEpKQoJCQlicmVhazsKCX0KCglpZiAoIWlycV9saXN0W2ldLmlycSkgewoJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiByZXF1ZXN0X2lycSBmYWlsZWRcbiIpOwoJCXJldCA9IC1FTk9ERVY7CgkJZ290byBvdXRfcmVxaXJxOwoJfQoKCWlmICh1c2VpbnB1dCkgewoKCQlyZXQgPSBzb255cGlfY3JlYXRlX2lucHV0X2RldmljZXMoKTsKCQlpZiAocmV0KQoJCQlnb3RvIG91dF9pbnB1dGRldmljZXM7CgoJCXNwaW5fbG9ja19pbml0KCZzb255cGlfZGV2aWNlLmlucHV0X2ZpZm9fbG9jayk7CgkJc29ueXBpX2RldmljZS5pbnB1dF9maWZvID0KCQkJa2ZpZm9fYWxsb2MoU09OWVBJX0JVRl9TSVpFLCBHRlBfS0VSTkVMLAoJCQkJICAgICZzb255cGlfZGV2aWNlLmlucHV0X2ZpZm9fbG9jayk7CgkJaWYgKElTX0VSUihzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pKSB7CgkJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBrZmlmb19hbGxvYyBmYWlsZWRcbiIpOwoJCQlyZXQgPSBQVFJfRVJSKHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbyk7CgkJCWdvdG8gb3V0X2luZmlmbzsKCQl9CgoJCUlOSVRfV09SSygmc29ueXBpX2RldmljZS5pbnB1dF93b3JrLCBpbnB1dF9rZXlyZWxlYXNlLCBOVUxMKTsKCX0KCglzb255cGlfZGV2aWNlLnBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJzb255cGkiLCAtMSwKCQkJCQkJCSAgICAgTlVMTCwgMCk7CglpZiAoSVNfRVJSKHNvbnlwaV9kZXZpY2UucGRldikpIHsKCQlyZXQgPSBQVFJfRVJSKHNvbnlwaV9kZXZpY2UucGRldik7CgkJZ290byBvdXRfcGxhdGZvcm1kZXY7Cgl9CgoJc29ueXBpX2VuYWJsZSgwKTsKCglwcmludGsoS0VSTl9JTkZPICJzb255cGk6IFNvbnkgUHJvZ3JhbW1hYmxlIEkvTyBDb250cm9sbGVyIERyaXZlciIKCSAgICAgICAidiVzLlxuIiwgU09OWVBJX0RSSVZFUl9WRVJTSU9OKTsKCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogZGV0ZWN0ZWQgdHlwZSVkIG1vZGVsLCAiCgkgICAgICAgInZlcmJvc2UgPSAlZCwgZm5rZXlpbml0ID0gJXMsIGNhbWVyYSA9ICVzLCAiCgkgICAgICAgImNvbXBhdCA9ICVzLCBtYXNrID0gMHglMDhseCwgdXNlaW5wdXQgPSAlcywgYWNwaSA9ICVzXG4iLAoJICAgICAgIHNvbnlwaV9kZXZpY2UubW9kZWwsCgkgICAgICAgdmVyYm9zZSwKCSAgICAgICBmbmtleWluaXQgPyAib24iIDogIm9mZiIsCgkgICAgICAgY2FtZXJhID8gIm9uIiA6ICJvZmYiLAoJICAgICAgIGNvbXBhdCA/ICJvbiIgOiAib2ZmIiwKCSAgICAgICBtYXNrLAoJICAgICAgIHVzZWlucHV0ID8gIm9uIiA6ICJvZmYiLAoJICAgICAgIFNPTllQSV9BQ1BJX0FDVElWRSA/ICJvbiIgOiAib2ZmIik7CglwcmludGsoS0VSTl9JTkZPICJzb255cGk6IGVuYWJsZWQgYXQgaXJxPSVkLCBwb3J0MT0weCV4LCBwb3J0Mj0weCV4XG4iLAoJICAgICAgIHNvbnlwaV9kZXZpY2UuaXJxLAoJICAgICAgIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSwgc29ueXBpX2RldmljZS5pb3BvcnQyKTsKCglpZiAobWlub3IgPT0gLTEpCgkJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBkZXZpY2UgYWxsb2NhdGVkIG1pbm9yIGlzICVkXG4iLAoJCSAgICAgICBzb255cGlfbWlzY19kZXZpY2UubWlub3IpOwoKCXJldHVybiAwOwoKb3V0X3BsYXRmb3JtZGV2OgoJa2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pOwpvdXRfaW5maWZvOgoJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2KTsKCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldik7Cm91dF9pbnB1dGRldmljZXM6CglmcmVlX2lycShzb255cGlfZGV2aWNlLmlycSwgc29ueXBpX2lycSk7Cm91dF9yZXFpcnE6CglyZWxlYXNlX3JlZ2lvbihzb255cGlfZGV2aWNlLmlvcG9ydDEsIHNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUpOwpvdXRfcmVxcmVnOgoJbWlzY19kZXJlZ2lzdGVyKCZzb255cGlfbWlzY19kZXZpY2UpOwpvdXRfbWlzY3JlZzoKCWlmIChwY2lkZXYpCgkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaWRldik7Cm91dF9wY2llbmFibGU6CglrZmlmb19mcmVlKHNvbnlwaV9kZXZpY2UuZmlmbyk7Cm91dF9maWZvOgoJcGNpX2Rldl9wdXQoc29ueXBpX2RldmljZS5kZXYpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQgX19kZXZleGl0IHNvbnlwaV9yZW1vdmUodm9pZCkKewoJc29ueXBpX2Rpc2FibGUoKTsKCglzeW5jaHJvbml6ZV9zY2hlZCgpOyAgLyogQWxsb3cgc29ueXBpIGludGVycnVwdCB0byBjb21wbGV0ZS4gKi8KCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CgoJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc29ueXBpX2RldmljZS5wZGV2KTsKCglpZiAodXNlaW5wdXQpIHsKCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYpOwoJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldik7CgkJa2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pOwoJfQoKCWZyZWVfaXJxKHNvbnlwaV9kZXZpY2UuaXJxLCBzb255cGlfaXJxKTsKCXJlbGVhc2VfcmVnaW9uKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSwgc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSk7CgltaXNjX2RlcmVnaXN0ZXIoJnNvbnlwaV9taXNjX2RldmljZSk7CglpZiAoc29ueXBpX2RldmljZS5kZXYpCgkJcGNpX2Rpc2FibGVfZGV2aWNlKHNvbnlwaV9kZXZpY2UuZGV2KTsKCWtmaWZvX2ZyZWUoc29ueXBpX2RldmljZS5maWZvKTsKCXBjaV9kZXZfcHV0KHNvbnlwaV9kZXZpY2UuZGV2KTsKCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogcmVtb3ZlZC5cbiIpOwp9CgpzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBzb255cGlfZG1pX3RhYmxlW10gPSB7Cgl7CgkJLmlkZW50ID0gIlNvbnkgVmFpbyIsCgkJLm1hdGNoZXMgPSB7CgkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQQ0ctIiksCgkJfSwKCX0sCgl7CgkJLmlkZW50ID0gIlNvbnkgVmFpbyIsCgkJLm1hdGNoZXMgPSB7CgkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWR04tIiksCgkJfSwKCX0sCgl7IH0KfTsKCnN0YXRpYyBpbnQgX19pbml0IHNvbnlwaV9pbml0KHZvaWQpCnsKCWludCByZXQ7CgoJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKHNvbnlwaV9kbWlfdGFibGUpKQoJCXJldHVybiAtRU5PREVWOwoKCXJldCA9IGRyaXZlcl9yZWdpc3Rlcigmc29ueXBpX2RyaXZlcik7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgoJcmV0ID0gc29ueXBpX3Byb2JlKCk7CglpZiAocmV0KQoJCWRyaXZlcl91bnJlZ2lzdGVyKCZzb255cGlfZHJpdmVyKTsKCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgc29ueXBpX2V4aXQodm9pZCkKewoJZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlwaV9kcml2ZXIpOwoJc29ueXBpX3JlbW92ZSgpOwp9Cgptb2R1bGVfaW5pdChzb255cGlfaW5pdCk7Cm1vZHVsZV9leGl0KHNvbnlwaV9leGl0KTsK