ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2N2IzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCkBAIC0wLDAgKzEsMTA1MSBAQAorLyoKKyAqIDZwYWNrLmMJVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgNnBhY2sgcHJvdG9jb2wgZm9yIGtlcm5lbC1iYXNlZAorICoJCWRldmljZXMgbGlrZSBUVFkuIEl0IGludGVyZmFjZXMgYmV0d2VlbiBhIHJhdyBUVFkgYW5kIHRoZQorICoJCWtlcm5lbCdzIEFYLjI1IHByb3RvY29sIGxheWVycy4KKyAqCisgKiBBdXRob3JzOglBbmRyZWFzIEv2bnNnZW4gPGFqa0BpZWhrLnJ3dGgtYWFjaGVuLmRlPgorICogICAgICAgICAgICAgIFJhbGYgQmFlY2hsZSBETDVSQiA8cmFsZkBsaW51eC1taXBzLm9yZz4KKyAqCisgKiBRdWl0ZSBhIGxvdCBvZiBzdHVmZiAic3RvbGVuIiBieSBKb2VyZyBSZXV0ZXIgZnJvbSBzbGlwLmMsIHdyaXR0ZW4gYnkKKyAqCisgKgkJTGF1cmVuY2UgQ3VsaGFuZSwgPGxvekBob2xtZXMuZGVtb24uY28udWs+CisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHV3YWx0Lm5sLm11Z25ldC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworI2RlZmluZSBTSVhQQUNLX1ZFUlNJT04gICAgIlJldmlzaW9uOiAwLjMuMCIKKworLyogc2l4cGFjayBwcmlvcml0eSBjb21tYW5kcyAqLworI2RlZmluZSBTSVhQX1NFT0YJCTB4NDAJLyogc3RhcnQgYW5kIGVuZCBvZiBhIDZwYWNrIGZyYW1lICovCisjZGVmaW5lIFNJWFBfVFhfVVJVTgkJMHg0OAkvKiB0cmFuc21pdCBvdmVycnVuICovCisjZGVmaW5lIFNJWFBfUlhfT1JVTgkJMHg1MAkvKiByZWNlaXZlIG92ZXJydW4gKi8KKyNkZWZpbmUgU0lYUF9SWF9CVUZfT1ZMCQkweDU4CS8qIHJlY2VpdmUgYnVmZmVyIG92ZXJmbG93ICovCisKKyNkZWZpbmUgU0lYUF9DSEtTVU0JCTB4RkYJLyogdmFsaWQgY2hlY2tzdW0gb2YgYSA2cGFjayBmcmFtZSAqLworCisvKiBtYXNrcyB0byBnZXQgY2VydGFpbiBiaXRzIG91dCBvZiB0aGUgc3RhdHVzIGJ5dGVzIHNlbnQgYnkgdGhlIFROQyAqLworCisjZGVmaW5lIFNJWFBfQ01EX01BU0sJCTB4QzAKKyNkZWZpbmUgU0lYUF9DSE5fTUFTSwkJMHgwNworI2RlZmluZSBTSVhQX1BSSU9fQ01EX01BU0sJMHg4MAorI2RlZmluZSBTSVhQX1NURF9DTURfTUFTSwkweDQwCisjZGVmaW5lIFNJWFBfUFJJT19EQVRBX01BU0sJMHgzOAorI2RlZmluZSBTSVhQX1RYX01BU0sJCTB4MjAKKyNkZWZpbmUgU0lYUF9SWF9NQVNLCQkweDEwCisjZGVmaW5lIFNJWFBfUlhfRENEX01BU0sJMHgxOAorI2RlZmluZSBTSVhQX0xFRFNfT04JCTB4NzgKKyNkZWZpbmUgU0lYUF9MRURTX09GRgkJMHg2MAorI2RlZmluZSBTSVhQX0NPTgkJMHgwOAorI2RlZmluZSBTSVhQX1NUQQkJMHgxMAorCisjZGVmaW5lIFNJWFBfRk9VTkRfVE5DCQkweGU5CisjZGVmaW5lIFNJWFBfQ09OX09OCQkweDY4CisjZGVmaW5lIFNJWFBfRENEX01BU0sJCTB4MDgKKyNkZWZpbmUgU0lYUF9EQU1BX09GRgkJMAorCisvKiBkZWZhdWx0IGxldmVsIDIgcGFyYW1ldGVycyAqLworI2RlZmluZSBTSVhQX1RYREVMQVkJCQkoSFovNCkJLyogaW4gMSBzICovCisjZGVmaW5lIFNJWFBfUEVSU0lTVAkJCTUwCS8qIGluIDI1NnRocyAqLworI2RlZmluZSBTSVhQX1NMT1RUSU1FCQkJKEhaLzEwKQkvKiBpbiAxIHMgKi8KKyNkZWZpbmUgU0lYUF9JTklUX1JFU1lOQ19USU1FT1VUCSgzKkhaLzIpIC8qIGluIDEgcyAqLworI2RlZmluZSBTSVhQX1JFU1lOQ19USU1FT1VUCQk1KkhaCS8qIGluIDEgcyAqLworCisvKiA2cGFjayBjb25maWd1cmF0aW9uLiAqLworI2RlZmluZSBTSVhQX05SVU5JVAkJCTMxICAgICAgLyogTUFYIG51bWJlciBvZiA2cGFjayBjaGFubmVscyAqLworI2RlZmluZSBTSVhQX01UVQkJCTI1NgkvKiBEZWZhdWx0IE1UVSAqLworCitlbnVtIHNpeHBhY2tfZmxhZ3MgeworCVNJWFBGX0VSUk9SLAkvKiBQYXJpdHksIGV0Yy4gZXJyb3IJKi8KK307CisKK3N0cnVjdCBzaXhwYWNrIHsKKwkvKiBWYXJpb3VzIGZpZWxkcy4gKi8KKwlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwkJLyogcHRyIHRvIFRUWSBzdHJ1Y3R1cmUJKi8KKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwkJLyogZWFzeSBmb3IgaW50ciBoYW5kbGluZyAgKi8KKworCS8qIFRoZXNlIGFyZSBwb2ludGVycyB0byB0aGUgbWFsbG9jKCllZCBmcmFtZSBidWZmZXJzLiAqLworCXVuc2lnbmVkIGNoYXIJCSpyYnVmZjsJCS8qIHJlY2VpdmVyIGJ1ZmZlcgkqLworCWludAkJCXJjb3VudDsgICAgICAgICAvKiByZWNlaXZlZCBjaGFycyBjb3VudGVyICAqLworCXVuc2lnbmVkIGNoYXIJCSp4YnVmZjsJCS8qIHRyYW5zbWl0dGVyIGJ1ZmZlcgkqLworCXVuc2lnbmVkIGNoYXIJCSp4aGVhZDsgICAgICAgICAvKiBuZXh0IGJ5dGUgdG8gWE1JVCAqLworCWludAkJCXhsZWZ0OyAgICAgICAgICAvKiBieXRlcyBsZWZ0IGluIFhNSVQgcXVldWUgICovCisKKwl1bnNpZ25lZCBjaGFyCQlyYXdfYnVmWzRdOworCXVuc2lnbmVkIGNoYXIJCWNvb2tlZF9idWZbNDAwXTsKKworCXVuc2lnbmVkIGludAkJcnhfY291bnQ7CisJdW5zaWduZWQgaW50CQlyeF9jb3VudF9jb29rZWQ7CisKKwkvKiA2cGFjayBpbnRlcmZhY2Ugc3RhdGlzdGljcy4gKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCWludAkJCW10dTsJCS8qIE91ciBtdHUgKHRvIHNwb3QgY2hhbmdlcyEpICovCisJaW50CQkJYnVmZnNpemU7ICAgICAgIC8qIE1heCBidWZmZXJzIHNpemVzICovCisKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIEZsYWcgdmFsdWVzLyBtb2RlIGV0YyAqLworCXVuc2lnbmVkIGNoYXIJCW1vZGU7CQkvKiA2cGFjayBtb2RlICovCisKKwkvKiA2cGFjayBzdHVmZiAqLworCXVuc2lnbmVkIGNoYXIJCXR4X2RlbGF5OworCXVuc2lnbmVkIGNoYXIJCXBlcnNpc3RlbmNlOworCXVuc2lnbmVkIGNoYXIJCXNsb3R0aW1lOworCXVuc2lnbmVkIGNoYXIJCWR1cGxleDsKKwl1bnNpZ25lZCBjaGFyCQlsZWRfc3RhdGU7CisJdW5zaWduZWQgY2hhcgkJc3RhdHVzOworCXVuc2lnbmVkIGNoYXIJCXN0YXR1czE7CisJdW5zaWduZWQgY2hhcgkJc3RhdHVzMjsKKwl1bnNpZ25lZCBjaGFyCQl0eF9lbmFibGU7CisJdW5zaWduZWQgY2hhcgkJdG5jX3N0YXRlOworCisJc3RydWN0IHRpbWVyX2xpc3QJdHhfdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdAlyZXN5bmNfdDsKKwlhdG9taWNfdAkJcmVmY250OworCXN0cnVjdCBzZW1hcGhvcmUJZGVhZF9zZW07CisJc3BpbmxvY2tfdAkJbG9jazsKK307CisKKyNkZWZpbmUgQVgyNV82UEFDS19IRUFERVJfTEVOIDAKKworc3RhdGljIHZvaWQgc3Bfc3RhcnRfdHhfdGltZXIoc3RydWN0IHNpeHBhY2sgKik7CitzdGF0aWMgdm9pZCBzaXhwYWNrX2RlY29kZShzdHJ1Y3Qgc2l4cGFjayAqLCB1bnNpZ25lZCBjaGFyW10sIGludCk7CitzdGF0aWMgaW50IGVuY29kZV9zaXhwYWNrKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQsIHVuc2lnbmVkIGNoYXIpOworCisvKgorICogcGVyZm9ybSB0aGUgcGVyc2lzdGVuY2Uvc2xvdHRpbWUgYWxnb3JpdGhtIGZvciBDU01BIGFjY2Vzcy4gSWYgdGhlCisgKiBwZXJzaXN0ZW5jZSBjaGVjayB3YXMgc3VjY2Vzc2Z1bCwgd3JpdGUgdGhlIGRhdGEgdG8gdGhlIHNlcmlhbCBkcml2ZXIuCisgKiBOb3RlIHRoYXQgaW4gY2FzZSBvZiBEQU1BIG9wZXJhdGlvbiwgdGhlIGRhdGEgaXMgbm90IHNlbnQgaGVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBzcF94bWl0X29uX2Fpcih1bnNpZ25lZCBsb25nIGNoYW5uZWwpCit7CisJc3RydWN0IHNpeHBhY2sgKnNwID0gKHN0cnVjdCBzaXhwYWNrICopIGNoYW5uZWw7CisJaW50IGFjdHVhbDsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciByYW5kb207CisKKwlyYW5kb20gPSByYW5kb20gKiAxNyArIDQxOworCisJaWYgKCgoc3AtPnN0YXR1czEgJiBTSVhQX0RDRF9NQVNLKSA9PSAwKSAmJiAocmFuZG9tIDwgc3AtPnBlcnNpc3RlbmNlKSkgeworCQlzcC0+bGVkX3N0YXRlID0gMHg3MDsKKwkJc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCAmc3AtPmxlZF9zdGF0ZSwgMSk7CisJCXNwLT50eF9lbmFibGUgPSAxOworCQlhY3R1YWwgPSBzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksIHNwLT54YnVmZiwgc3AtPnN0YXR1czIpOworCQlzcC0+eGxlZnQgLT0gYWN0dWFsOworCQlzcC0+eGhlYWQgKz0gYWN0dWFsOworCQlzcC0+bGVkX3N0YXRlID0gMHg2MDsKKwkJc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCAmc3AtPmxlZF9zdGF0ZSwgMSk7CisJCXNwLT5zdGF0dXMyID0gMDsKKwl9IGVsc2UKKwkJc3Bfc3RhcnRfdHhfdGltZXIoc3ApOworfQorCisvKiAtLS0tPiA2cGFjayB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgZnJpZW5kcy4gPC0tLS0gKi8KK3N0YXRpYyB2b2lkIHNwX3N0YXJ0X3R4X3RpbWVyKHN0cnVjdCBzaXhwYWNrICpzcCkKK3sKKwlpbnQgd2hlbiA9IHNwLT5zbG90dGltZTsKKworCWRlbF90aW1lcigmc3AtPnR4X3QpOworCXNwLT50eF90LmRhdGEgPSAodW5zaWduZWQgbG9uZykgc3A7CisJc3AtPnR4X3QuZnVuY3Rpb24gPSBzcF94bWl0X29uX2FpcjsKKwlzcC0+dHhfdC5leHBpcmVzID0gamlmZmllcyArICgod2hlbiArIDEpICogSFopIC8gMTAwOworCWFkZF90aW1lcigmc3AtPnR4X3QpOworfQorCisvKiBFbmNhcHN1bGF0ZSBvbmUgQVguMjUgZnJhbWUgYW5kIHN0dWZmIGludG8gYSBUVFkgcXVldWUuICovCitzdGF0aWMgdm9pZCBzcF9lbmNhcHMoc3RydWN0IHNpeHBhY2sgKnNwLCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqbXNnLCAqcCA9IGljcDsKKwlpbnQgYWN0dWFsLCBjb3VudDsKKworCWlmIChsZW4gPiBzcC0+bXR1KSB7CS8qIHNwLT5tdHUgPSBBWDI1X01UVSA9IG1heC4gUEFDTEVOID0gMjU2ICovCisJCW1zZyA9ICJvdmVyc2l6ZWQgdHJhbnNtaXQgcGFja2V0ISI7CisJCWdvdG8gb3V0X2Ryb3A7CisJfQorCisJaWYgKGxlbiA+IHNwLT5tdHUpIHsJLyogc3AtPm10dSA9IEFYMjVfTVRVID0gbWF4LiBQQUNMRU4gPSAyNTYgKi8KKwkJbXNnID0gIm92ZXJzaXplZCB0cmFuc21pdCBwYWNrZXQhIjsKKwkJZ290byBvdXRfZHJvcDsKKwl9CisKKwlpZiAocFswXSA+IDUpIHsKKwkJbXNnID0gImludmFsaWQgS0lTUyBjb21tYW5kIjsKKwkJZ290byBvdXRfZHJvcDsKKwl9CisKKwlpZiAoKHBbMF0gIT0gMCkgJiYgKGxlbiA+IDIpKSB7CisJCW1zZyA9ICJLSVNTIGNvbnRyb2wgcGFja2V0IHRvbyBsb25nIjsKKwkJZ290byBvdXRfZHJvcDsKKwl9CisKKwlpZiAoKHBbMF0gPT0gMCkgJiYgKGxlbiA8IDE1KSkgeworCQltc2cgPSAiYmFkIEFYLjI1IHBhY2tldCB0byB0cmFuc21pdCI7CisJCWdvdG8gb3V0X2Ryb3A7CisJfQorCisJY291bnQgPSBlbmNvZGVfc2l4cGFjayhwLCBzcC0+eGJ1ZmYsIGxlbiwgc3AtPnR4X2RlbGF5KTsKKwlzZXRfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZzcC0+dHR5LT5mbGFncyk7CisKKwlzd2l0Y2ggKHBbMF0pIHsKKwljYXNlIDE6CXNwLT50eF9kZWxheSA9IHBbMV07CisJCXJldHVybjsKKwljYXNlIDI6CXNwLT5wZXJzaXN0ZW5jZSA9IHBbMV07CisJCXJldHVybjsKKwljYXNlIDM6CXNwLT5zbG90dGltZSA9IHBbMV07CisJCXJldHVybjsKKwljYXNlIDQ6CS8qIGlnbm9yZWQgKi8KKwkJcmV0dXJuOworCWNhc2UgNToJc3AtPmR1cGxleCA9IHBbMV07CisJCXJldHVybjsKKwl9CisKKwlpZiAocFswXSAhPSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEluIGNhc2Ugb2YgZnVsbGR1cGxleCBvciBEQU1BIG9wZXJhdGlvbiwgd2UgZG9uJ3QgdGFrZSBjYXJlIGFib3V0IHRoZQorCSAqIHN0YXRlIG9mIHRoZSBEQ0Qgb3Igb2YgYW55IHRpbWVycywgYXMgdGhlIGRldGVybWluYXRpb24gb2YgdGhlCisJICogY29ycmVjdCB0aW1lIHRvIHNlbmQgaXMgdGhlIGpvYiBvZiB0aGUgQVguMjUgbGF5ZXIuIFdlIHNlbmQKKwkgKiBpbW1lZGlhdGVseSBhZnRlciBkYXRhIGhhcyBhcnJpdmVkLgorCSAqLworCWlmIChzcC0+ZHVwbGV4ID09IDEpIHsKKwkJc3AtPmxlZF9zdGF0ZSA9IDB4NzA7CisJCXNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgJnNwLT5sZWRfc3RhdGUsIDEpOworCQlzcC0+dHhfZW5hYmxlID0gMTsKKwkJYWN0dWFsID0gc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCBzcC0+eGJ1ZmYsIGNvdW50KTsKKwkJc3AtPnhsZWZ0ID0gY291bnQgLSBhY3R1YWw7CisJCXNwLT54aGVhZCA9IHNwLT54YnVmZiArIGFjdHVhbDsKKwkJc3AtPmxlZF9zdGF0ZSA9IDB4NjA7CisJCXNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgJnNwLT5sZWRfc3RhdGUsIDEpOworCX0gZWxzZSB7CisJCXNwLT54bGVmdCA9IGNvdW50OworCQlzcC0+eGhlYWQgPSBzcC0+eGJ1ZmY7CisJCXNwLT5zdGF0dXMyID0gY291bnQ7CisJCWlmIChzcC0+ZHVwbGV4ID09IDApCisJCQlzcF9zdGFydF90eF90aW1lcihzcCk7CisJfQorCisJcmV0dXJuOworCitvdXRfZHJvcDoKKwlzcC0+c3RhdHMudHhfZHJvcHBlZCsrOworCW5ldGlmX3N0YXJ0X3F1ZXVlKHNwLT5kZXYpOworCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgLSBkcm9wcGVkLlxuIiwgc3AtPmRldi0+bmFtZSwgbXNnKTsKK30KKworLyogRW5jYXBzdWxhdGUgYW4gSVAgZGF0YWdyYW0gYW5kIGtpY2sgaXQgaW50byBhIFRUWSBxdWV1ZS4gKi8KKworc3RhdGljIGludCBzcF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpeHBhY2sgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19iaCgmc3AtPmxvY2spOworCS8qIFdlIHdlcmUgbm90IGJ1c3ksIHNvIHdlIGFyZSBub3cuLi4gOi0pICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlzcF9lbmNhcHMoc3AsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNwaW5fdW5sb2NrX2JoKCZzcC0+bG9jayk7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcF9vcGVuX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXhwYWNrICpzcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoc3AtPnR0eSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKworLyogQ2xvc2UgdGhlIGxvdy1sZXZlbCBwYXJ0IG9mIHRoZSA2cGFjayBjaGFubmVsLiAqLworc3RhdGljIGludCBzcF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXhwYWNrICpzcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfYmgoJnNwLT5sb2NrKTsKKwlpZiAoc3AtPnR0eSkgeworCQkvKiBUVFkgZGlzY2lwbGluZSBpcyBydW5uaW5nLiAqLworCQljbGVhcl9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnNwLT50dHktPmZsYWdzKTsKKwl9CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNwaW5fdW5sb2NrX2JoKCZzcC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSBmcmFtZSB0eXBlIElEICovCitzdGF0aWMgaW50IHNwX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKQoreworI2lmZGVmIENPTkZJR19JTkVUCisJaWYgKHR5cGUgIT0gaHRvbnMoRVRIX1BfQVgyNSkpCisJCXJldHVybiBheDI1X2VuY2Fwc3VsYXRlKHNrYiwgZGV2LCB0eXBlLCBkYWRkciwgc2FkZHIsIGxlbik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2l4cGFjayAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmc3AtPnN0YXRzOworfQorCitzdGF0aWMgaW50IHNwX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzb2NrYWRkcl9heDI1ICpzYSA9IGFkZHI7CisKKwlpZiAoc2EtPnNheDI1X2ZhbWlseSAhPSBBRl9BWDI1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2EtPnNheDI1X25kaWdpcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxKCZkZXYtPnhtaXRfbG9jayk7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICZzYS0+c2F4MjVfY2FsbCwgQVgyNV9BRERSX0xFTik7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnhtaXRfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworI2lmZGVmIENPTkZJR19JTkVUCisJcmV0dXJuIGF4MjVfcmVidWlsZF9oZWFkZXIoc2tiKTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgc3Bfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgY2hhciBheDI1X2JjYXN0W0FYMjVfQUREUl9MRU5dID0KKwkJeydRJzw8MSwnUyc8PDEsJ1QnPDwxLCcgJzw8MSwnICc8PDEsJyAnPDwxLCcwJzw8MX07CisJc3RhdGljIGNoYXIgYXgyNV90ZXN0W0FYMjVfQUREUl9MRU5dID0KKwkJeydMJzw8MSwnSSc8PDEsJ04nPDwxLCdVJzw8MSwnWCc8PDEsJyAnPDwxLCcxJzw8MX07CisKKwkvKiBGaW5pc2ggc2V0dGluZyB1cCB0aGUgREVWSUNFIGluZm8uICovCisJZGV2LT5tdHUJCT0gU0lYUF9NVFU7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBzcF94bWl0OworCWRldi0+b3BlbgkJPSBzcF9vcGVuX2RldjsKKwlkZXYtPmRlc3RydWN0b3IJCT0gZnJlZV9uZXRkZXY7CisJZGV2LT5zdG9wCQk9IHNwX2Nsb3NlOworCWRldi0+aGFyZF9oZWFkZXIJPSBzcF9oZWFkZXI7CisJZGV2LT5nZXRfc3RhdHMJICAgICAgICA9IHNwX2dldF9zdGF0czsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyAgICA9IHNwX3NldF9tYWNfYWRkcmVzczsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IEFYMjVfTUFYX0hFQURFUl9MRU47CisJZGV2LT5hZGRyX2xlbgkJPSBBWDI1X0FERFJfTEVOOworCWRldi0+dHlwZQkJPSBBUlBIUkRfQVgyNTsKKwlkZXYtPnR4X3F1ZXVlX2xlbgk9IDEwOworCWRldi0+cmVidWlsZF9oZWFkZXIJPSBzcF9yZWJ1aWxkX2hlYWRlcjsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gTlVMTDsKKworCS8qIE9ubHkgYWN0aXZhdGVkIGluIEFYLjI1IG1vZGUgKi8KKwltZW1jcHkoZGV2LT5icm9hZGNhc3QsIGF4MjVfYmNhc3QsIEFYMjVfQUREUl9MRU4pOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBheDI1X3Rlc3QsIEFYMjVfQUREUl9MRU4pOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZGV2LT5mbGFncwkJPSAwOworfQorCisvKiBTZW5kIG9uZSBjb21wbGV0ZWx5IGRlY2Fwc3VsYXRlZCBJUCBkYXRhZ3JhbSB0byB0aGUgSVAgbGF5ZXIuICovCisKKy8qCisgKiBUaGlzIGlzIHRoZSByb3V0aW5lIHRoYXQgc2VuZHMgdGhlIHJlY2VpdmVkIGRhdGEgdG8gdGhlIGtlcm5lbCBBWC4yNS4KKyAqICdjbWQnIGlzIHRoZSBLSVNTIGNvbW1hbmQuIEZvciBBWC4yNSBkYXRhLCBpdCBpcyB6ZXJvLgorICovCisKK3N0YXRpYyB2b2lkIHNwX2J1bXAoc3RydWN0IHNpeHBhY2sgKnNwLCBjaGFyIGNtZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwljb3VudCA9IHNwLT5yY291bnQgKyAxOworCisJc3AtPnN0YXRzLnJ4X2J5dGVzICs9IGNvdW50OworCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKGNvdW50KSkgPT0gTlVMTCkKKwkJZ290byBvdXRfbWVtOworCisJc2tiLT5kZXYgPSBzcC0+ZGV2OworCXB0ciA9IHNrYl9wdXQoc2tiLCBjb3VudCk7CisJKnB0cisrID0gY21kOwkvKiBLSVNTIGNvbW1hbmQgKi8KKworCW1lbWNweShwdHIsIHNwLT5jb29rZWRfYnVmICsgMSwgY291bnQpOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVgyNSk7CisJbmV0aWZfcngoc2tiKTsKKwlzcC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlzcC0+c3RhdHMucnhfcGFja2V0cysrOworCisJcmV0dXJuOworCitvdXRfbWVtOgorCXNwLT5zdGF0cy5yeF9kcm9wcGVkKys7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFdlIGhhdmUgYSBwb3RlbnRpYWwgcmFjZSBvbiBkZXJlZmVyZW5jaW5nIHR0eS0+ZGlzY19kYXRhLCBiZWNhdXNlIHRoZSB0dHkKKyAqIGxheWVyIHByb3ZpZGVzIG5vIGxvY2tpbmcgYXQgYWxsIC0gdGh1cyBvbmUgY3B1IGNvdWxkIGJlIHJ1bm5pbmcKKyAqIHNpeHBhY2tfcmVjZWl2ZV9idWYgd2hpbGUgYW5vdGhlciBjYWxscyBzaXhwYWNrX2Nsb3NlLCB3aGljaCB6ZXJvZXMKKyAqIHR0eS0+ZGlzY19kYXRhIGFuZCBmcmVlcyB0aGUgbWVtb3J5IHRoYXQgc2l4cGFja19yZWNlaXZlX2J1ZiBpcyB1c2luZy4gIFRoZQorICogYmVzdCB3YXkgdG8gZml4IHRoaXMgaXMgdG8gdXNlIGEgcndsb2NrIGluIHRoZSB0dHkgc3RydWN0LCBidXQgZm9yIG5vdyB3ZQorICogdXNlIGEgc2luZ2xlIGdsb2JhbCByd2xvY2sgZm9yIGFsbCB0dHlzIGluIHBwcCBsaW5lIGRpc2NpcGxpbmUuCisgKi8KK3N0YXRpYyBERUZJTkVfUldMT0NLKGRpc2NfZGF0YV9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitzdGF0aWMgc3RydWN0IHNpeHBhY2sgKnNwX2dldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzaXhwYWNrICpzcDsKKworCXJlYWRfbG9jaygmZGlzY19kYXRhX2xvY2spOworCXNwID0gdHR5LT5kaXNjX2RhdGE7CisJaWYgKHNwKQorCQlhdG9taWNfaW5jKCZzcC0+cmVmY250KTsKKwlyZWFkX3VubG9jaygmZGlzY19kYXRhX2xvY2spOworCisJcmV0dXJuIHNwOworfQorCitzdGF0aWMgdm9pZCBzcF9wdXQoc3RydWN0IHNpeHBhY2sgKnNwKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzcC0+cmVmY250KSkKKwkJdXAoJnNwLT5kZWFkX3NlbSk7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgdGhlIFRUWSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKKyAqIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqLworc3RhdGljIHZvaWQgc2l4cGFja193cml0ZV93YWtldXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc2l4cGFjayAqc3AgPSBzcF9nZXQodHR5KTsKKwlpbnQgYWN0dWFsOworCisJaWYgKCFzcCkKKwkJcmV0dXJuOworCWlmIChzcC0+eGxlZnQgPD0gMCkgIHsKKwkJLyogTm93IHNlcmlhbCBidWZmZXIgaXMgYWxtb3N0IGZyZWUgJiB3ZSBjYW4gc3RhcnQKKwkJICogdHJhbnNtaXNzaW9uIG9mIGFub3RoZXIgcGFja2V0ICovCisJCXNwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWNsZWFyX2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmdHR5LT5mbGFncyk7CisJCXNwLT50eF9lbmFibGUgPSAwOworCQluZXRpZl93YWtlX3F1ZXVlKHNwLT5kZXYpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc3AtPnR4X2VuYWJsZSkgeworCQlhY3R1YWwgPSB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBzcC0+eGhlYWQsIHNwLT54bGVmdCk7CisJCXNwLT54bGVmdCAtPSBhY3R1YWw7CisJCXNwLT54aGVhZCArPSBhY3R1YWw7CisJfQorCitvdXQ6CisJc3BfcHV0KHNwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzaXhwYWNrX3JlY2VpdmVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybiA2NTUzNjsgIC8qIFdlIGNhbiBoYW5kbGUgYW4gaW5maW5pdGUgYW1vdW50IG9mIGRhdGEuIDotKSAqLworfQorCisvKgorICogSGFuZGxlIHRoZSAncmVjZWl2ZXIgZGF0YSByZWFkeScgaW50ZXJydXB0LgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlICd0dHlfaW8nIG1vZHVsZSBpbiB0aGUga2VybmVsIHdoZW4KKyAqIGEgYmxvY2sgb2YgNnBhY2sgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCwgd2hpY2ggY2FuIG5vdyBiZSBkZWNhcHN1bGF0ZWQKKyAqIGFuZCBzZW50IG9uIHRvIHNvbWUgSVAgbGF5ZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAqLworc3RhdGljIHZvaWQgc2l4cGFja19yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQoreworCXN0cnVjdCBzaXhwYWNrICpzcDsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls1MTJdOworCWludCBjb3VudDE7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm47CisKKwlzcCA9IHNwX2dldCh0dHkpOworCWlmICghc3ApCisJCXJldHVybjsKKworCW1lbWNweShidWYsIGNwLCBjb3VudCA8IHNpemVvZihidWYpID8gY291bnQgOiBzaXplb2YoYnVmKSk7CisKKwkvKiBSZWFkIHRoZSBjaGFyYWN0ZXJzIG91dCBvZiB0aGUgYnVmZmVyICovCisKKwljb3VudDEgPSBjb3VudDsKKwl3aGlsZSAoY291bnQpIHsKKwkJY291bnQtLTsKKwkJaWYgKGZwICYmICpmcCsrKSB7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoU0lYUEZfRVJST1IsICZzcC0+ZmxhZ3MpKQorCQkJCXNwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXNpeHBhY2tfZGVjb2RlKHNwLCBidWYsIGNvdW50MSk7CisKKwlzcF9wdXQoc3ApOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpCisJICAgICYmIHR0eS0+ZHJpdmVyLT51bnRocm90dGxlKQorCQl0dHktPmRyaXZlci0+dW50aHJvdHRsZSh0dHkpOworfQorCisvKgorICogVHJ5IHRvIHJlc3luYyB0aGUgVE5DLiBDYWxsZWQgYnkgdGhlIHJlc3luYyB0aW1lciBkZWZpbmVkIGluCisgKiBkZWNvZGVfcHJpb19jb21tYW5kCisgKi8KKworI2RlZmluZSBUTkNfVU5JTklUSUFMSVpFRAkwCisjZGVmaW5lIFROQ19VTlNZTkNfU1RBUlRVUAkxCisjZGVmaW5lIFROQ19VTlNZTkNFRAkJMgorI2RlZmluZSBUTkNfSU5fU1lOQwkJMworCitzdGF0aWMgdm9pZCBfX3RuY19zZXRfc3luY19zdGF0ZShzdHJ1Y3Qgc2l4cGFjayAqc3AsIGludCBuZXdfdG5jX3N0YXRlKQoreworCWNoYXIgKm1zZzsKKworCXN3aXRjaCAobmV3X3RuY19zdGF0ZSkgeworCWRlZmF1bHQ6CQkJLyogZ2NjIG9oIHBpZWNlLW8tY3JhcCAuLi4gKi8KKwljYXNlIFROQ19VTlNZTkNfU1RBUlRVUDoKKwkJbXNnID0gIlN5bmNocm9uaXppbmcgd2l0aCBUTkMiOworCQlicmVhazsKKwljYXNlIFROQ19VTlNZTkNFRDoKKwkJbXNnID0gIkxvc3Qgc3luY2hyb25pemF0aW9uIHdpdGggVE5DXG4iOworCQlicmVhazsKKwljYXNlIFROQ19JTl9TWU5DOgorCQltc2cgPSAiRm91bmQgVE5DIjsKKwkJYnJlYWs7CisJfQorCisJc3AtPnRuY19zdGF0ZSA9IG5ld190bmNfc3RhdGU7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzXG4iLCBzcC0+ZGV2LT5uYW1lLCBtc2cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdG5jX3NldF9zeW5jX3N0YXRlKHN0cnVjdCBzaXhwYWNrICpzcCwgaW50IG5ld190bmNfc3RhdGUpCit7CisJaW50IG9sZF90bmNfc3RhdGUgPSBzcC0+dG5jX3N0YXRlOworCisJaWYgKG9sZF90bmNfc3RhdGUgIT0gbmV3X3RuY19zdGF0ZSkKKwkJX190bmNfc2V0X3N5bmNfc3RhdGUoc3AsIG5ld190bmNfc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCByZXN5bmNfdG5jKHVuc2lnbmVkIGxvbmcgY2hhbm5lbCkKK3sKKwlzdHJ1Y3Qgc2l4cGFjayAqc3AgPSAoc3RydWN0IHNpeHBhY2sgKikgY2hhbm5lbDsKKwlzdGF0aWMgY2hhciByZXN5bmNfY21kID0gMHhlODsKKworCS8qIGNsZWFyIGFueSBkYXRhIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIHJlY2VpdmVkICovCisKKwlzcC0+cnhfY291bnQgPSAwOworCXNwLT5yeF9jb3VudF9jb29rZWQgPSAwOworCisJLyogcmVzZXQgc3RhdGUgbWFjaGluZSAqLworCisJc3AtPnN0YXR1cyA9IDE7CisJc3AtPnN0YXR1czEgPSAxOworCXNwLT5zdGF0dXMyID0gMDsKKworCS8qIHJlc3luYyB0aGUgVE5DICovCisKKwlzcC0+bGVkX3N0YXRlID0gMHg2MDsKKwlzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksICZzcC0+bGVkX3N0YXRlLCAxKTsKKwlzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksICZyZXN5bmNfY21kLCAxKTsKKworCisJLyogU3RhcnQgcmVzeW5jIHRpbWVyIGFnYWluIC0tIHRoZSBUTkMgbWlnaHQgYmUgc3RpbGwgYWJzZW50ICovCisKKwlkZWxfdGltZXIoJnNwLT5yZXN5bmNfdCk7CisJc3AtPnJlc3luY190LmRhdGEJPSAodW5zaWduZWQgbG9uZykgc3A7CisJc3AtPnJlc3luY190LmZ1bmN0aW9uCT0gcmVzeW5jX3RuYzsKKwlzcC0+cmVzeW5jX3QuZXhwaXJlcwk9IGppZmZpZXMgKyBTSVhQX1JFU1lOQ19USU1FT1VUOworCWFkZF90aW1lcigmc3AtPnJlc3luY190KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdG5jX2luaXQoc3RydWN0IHNpeHBhY2sgKnNwKQoreworCXVuc2lnbmVkIGNoYXIgaW5ieXRlID0gMHhlODsKKworCXRuY19zZXRfc3luY19zdGF0ZShzcCwgVE5DX1VOU1lOQ19TVEFSVFVQKTsKKworCXNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgJmluYnl0ZSwgMSk7CisKKwlkZWxfdGltZXIoJnNwLT5yZXN5bmNfdCk7CisJc3AtPnJlc3luY190LmRhdGEgPSAodW5zaWduZWQgbG9uZykgc3A7CisJc3AtPnJlc3luY190LmZ1bmN0aW9uID0gcmVzeW5jX3RuYzsKKwlzcC0+cmVzeW5jX3QuZXhwaXJlcyA9IGppZmZpZXMgKyBTSVhQX1JFU1lOQ19USU1FT1VUOworCWFkZF90aW1lcigmc3AtPnJlc3luY190KTsKKworCXJldHVybiAwOworfQorCisvKgorICogT3BlbiB0aGUgaGlnaC1sZXZlbCBwYXJ0IG9mIHRoZSA2cGFjayBjaGFubmVsLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIFRUWSBtb2R1bGUgd2hlbiB0aGUKKyAqIDZwYWNrIGxpbmUgZGlzY2lwbGluZSBpcyBjYWxsZWQgZm9yLiAgQmVjYXVzZSB3ZSBhcmUKKyAqIHN1cmUgdGhlIHR0eSBsaW5lIGV4aXN0cywgd2Ugb25seSBoYXZlIHRvIGxpbmsgaXQgdG8KKyAqIGEgZnJlZSA2cGNhY2sgY2hhbm5lbC4uLgorICovCitzdGF0aWMgaW50IHNpeHBhY2tfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWNoYXIgKnJidWZmID0gTlVMTCwgKnhidWZmID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzaXhwYWNrICpzcDsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwlpbnQgZXJyID0gMDsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHNpeHBhY2spLCAic3AlZCIsIHNwX3NldHVwKTsKKwlpZiAoIWRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3AtPmRldiA9IGRldjsKKworCXNwaW5fbG9ja19pbml0KCZzcC0+bG9jayk7CisJYXRvbWljX3NldCgmc3AtPnJlZmNudCwgMSk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJnNwLT5kZWFkX3NlbSk7CisKKwkvKiAhISEgbGVuZ3RoIG9mIHRoZSBidWZmZXJzLiBNVFUgaXMgSVAgTVRVLCBub3QgUEFDTEVOISAgKi8KKworCWxlbiA9IGRldi0+bXR1ICogMjsKKworCXJidWZmID0ga21hbGxvYyhsZW4gKyA0LCBHRlBfS0VSTkVMKTsKKwl4YnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAocmJ1ZmYgPT0gTlVMTCB8fCB4YnVmZiA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9CVUZTOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXNwaW5fbG9ja19iaCgmc3AtPmxvY2spOworCisJc3AtPnR0eSA9IHR0eTsKKworCXNwLT5yYnVmZgk9IHJidWZmOworCXNwLT54YnVmZgk9IHhidWZmOworCisJc3AtPm10dQkJPSBBWDI1X01UVSArIDczOworCXNwLT5idWZmc2l6ZQk9IGxlbjsKKwlzcC0+cmNvdW50CT0gMDsKKwlzcC0+cnhfY291bnQJPSAwOworCXNwLT5yeF9jb3VudF9jb29rZWQgPSAwOworCXNwLT54bGVmdAk9IDA7CisKKwlzcC0+ZmxhZ3MJPSAwOwkJLyogQ2xlYXIgRVNDQVBFICYgRVJST1IgZmxhZ3MgKi8KKworCXNwLT5kdXBsZXgJPSAwOworCXNwLT50eF9kZWxheSAgICA9IFNJWFBfVFhERUxBWTsKKwlzcC0+cGVyc2lzdGVuY2UgPSBTSVhQX1BFUlNJU1Q7CisJc3AtPnNsb3R0aW1lICAgID0gU0lYUF9TTE9UVElNRTsKKwlzcC0+bGVkX3N0YXRlICAgPSAweDYwOworCXNwLT5zdGF0dXMgICAgICA9IDE7CisJc3AtPnN0YXR1czEgICAgID0gMTsKKwlzcC0+c3RhdHVzMiAgICAgPSAwOworCXNwLT50eF9lbmFibGUgICA9IDA7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJaW5pdF90aW1lcigmc3AtPnR4X3QpOworCWluaXRfdGltZXIoJnNwLT5yZXN5bmNfdCk7CisKKwlzcGluX3VubG9ja19iaCgmc3AtPmxvY2spOworCisJLyogRG9uZS4gIFdlIGhhdmUgbGlua2VkIHRoZSBUVFkgbGluZSB0byBhIGNoYW5uZWwuICovCisJdHR5LT5kaXNjX2RhdGEgPSBzcDsKKworCS8qIE5vdyB3ZSdyZSByZWFkeSB0byByZWdpc3Rlci4gKi8KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwl0bmNfaW5pdChzcCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisJa2ZyZWUoeGJ1ZmYpOworCWtmcmVlKHJidWZmKTsKKworCWlmIChkZXYpCisJCWZyZWVfbmV0ZGV2KGRldik7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisKKy8qCisgKiBDbG9zZSBkb3duIGEgNnBhY2sgY2hhbm5lbC4KKyAqIFRoaXMgbWVhbnMgZmx1c2hpbmcgb3V0IGFueSBwZW5kaW5nIHF1ZXVlcywgYW5kIHRoZW4gcmVzdG9yaW5nIHRoZQorICogVFRZIGxpbmUgZGlzY2lwbGluZSB0byB3aGF0IGl0IHdhcyBiZWZvcmUgaXQgZ290IGhvb2tlZCB0byA2cGFjaworICogKHdoaWNoIHVzdWFsbHkgaXMgVFRZIGFnYWluKS4KKyAqLworc3RhdGljIHZvaWQgc2l4cGFja19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzaXhwYWNrICpzcDsKKworCXdyaXRlX2xvY2soJmRpc2NfZGF0YV9sb2NrKTsKKwlzcCA9IHR0eS0+ZGlzY19kYXRhOworCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKKwl3cml0ZV91bmxvY2soJmRpc2NfZGF0YV9sb2NrKTsKKwlpZiAoc3AgPT0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBXZSBoYXZlIG5vdyBlbnN1cmVkIHRoYXQgbm9ib2R5IGNhbiBzdGFydCB1c2luZyBhcCBmcm9tIG5vdyBvbiwgYnV0CisJICogd2UgaGF2ZSB0byB3YWl0IGZvciBhbGwgZXhpc3RpbmcgdXNlcnMgdG8gZmluaXNoLgorCSAqLworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmc3AtPnJlZmNudCkpCisJCWRvd24oJnNwLT5kZWFkX3NlbSk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihzcC0+ZGV2KTsKKworCWRlbF90aW1lcigmc3AtPnR4X3QpOworCWRlbF90aW1lcigmc3AtPnJlc3luY190KTsKKworCS8qIEZyZWUgYWxsIDZwYWNrIGZyYW1lIGJ1ZmZlcnMuICovCisJa2ZyZWUoc3AtPnJidWZmKTsKKwlrZnJlZShzcC0+eGJ1ZmYpOworfQorCisvKiBQZXJmb3JtIEkvTyBjb250cm9sIG9uIGFuIGFjdGl2ZSA2cGFjayBjaGFubmVsLiAqLworc3RhdGljIGludCBzaXhwYWNrX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzaXhwYWNrICpzcCA9IHNwX2dldCh0dHkpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzcC0+ZGV2OworCXVuc2lnbmVkIGludCB0bXAsIGVycjsKKworCWlmICghc3ApCisJCXJldHVybiAtRU5YSU87CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR0lGTkFNRToKKwkJZXJyID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsIGRldi0+bmFtZSwKKwkJICAgICAgICAgICAgICAgICAgIHN0cmxlbihkZXYtPm5hbWUpICsgMSkgPyAtRUZBVUxUIDogMDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSUZFTkNBUDoKKwkJZXJyID0gcHV0X3VzZXIoMCwgKGludCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSUZFTkNBUDoKKwkJaWYgKGdldF91c2VyKHRtcCwgKGludCBfX3VzZXIgKikgYXJnKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJc3AtPm1vZGUgPSB0bXA7CisJCWRldi0+YWRkcl9sZW4gICAgICAgID0gQVgyNV9BRERSX0xFTjsKKwkJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBBWDI1X0tJU1NfSEVBREVSX0xFTiArCisJCSAgICAgICAgICAgICAgICAgICAgICAgQVgyNV9NQVhfSEVBREVSX0xFTiArIDM7CisJCWRldi0+dHlwZSAgICAgICAgICAgID0gQVJQSFJEX0FYMjU7CisKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwkgY2FzZSBTSU9DU0lGSFdBRERSOiB7CisJCWNoYXIgYWRkcltBWDI1X0FERFJfTEVOXTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmFkZHIsCisJCSAgICAgICAgICAgICAgICAgICAodm9pZCBfX3VzZXIgKikgYXJnLCBBWDI1X0FERFJfTEVOKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycSgmZGV2LT54bWl0X2xvY2spOworCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgJmFkZHIsIEFYMjVfQUREUl9MRU4pOworCQlzcGluX3VubG9ja19pcnEoJmRldi0+eG1pdF9sb2NrKTsKKworCQllcnIgPSAwOworCQlicmVhazsKKwl9CisKKwkvKiBBbGxvdyBzdHR5IHRvIHJlYWQsIGJ1dCBub3Qgc2V0LCB0aGUgc2VyaWFsIHBvcnQgKi8KKwljYXNlIFRDR0VUUzoKKwljYXNlIFRDR0VUQToKKwkJZXJyID0gbl90dHlfaW9jdGwodHR5LCAoc3RydWN0IGZpbGUgKikgZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9JT0NUTENNRDsKKwl9CisKKwlzcF9wdXQoc3ApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2Mgc3BfbGRpc2MgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5tYWdpYwkJPSBUVFlfTERJU0NfTUFHSUMsCisJLm5hbWUJCT0gIjZwYWNrIiwKKwkub3BlbgkJPSBzaXhwYWNrX29wZW4sCisJLmNsb3NlCQk9IHNpeHBhY2tfY2xvc2UsCisJLmlvY3RsCQk9IHNpeHBhY2tfaW9jdGwsCisJLnJlY2VpdmVfYnVmCT0gc2l4cGFja19yZWNlaXZlX2J1ZiwKKwkucmVjZWl2ZV9yb29tCT0gc2l4cGFja19yZWNlaXZlX3Jvb20sCisJLndyaXRlX3dha2V1cAk9IHNpeHBhY2tfd3JpdGVfd2FrZXVwLAorfTsKKworLyogSW5pdGlhbGl6ZSA2cGFjayBjb250cm9sIGRldmljZSAtLSByZWdpc3RlciA2cGFjayBsaW5lIGRpc2NpcGxpbmUgKi8KKworc3RhdGljIGNoYXIgbXNnX2Jhbm5lcltdICBfX2luaXRkYXRhID0gS0VSTl9JTkZPIFwKKwkiQVguMjU6IDZwYWNrIGRyaXZlciwgIiBTSVhQQUNLX1ZFUlNJT04gIlxuIjsKK3N0YXRpYyBjaGFyIG1zZ19yZWdmYWlsW10gX19pbml0ZGF0YSA9IEtFUk5fRVJSICBcCisJIjZwYWNrOiBjYW4ndCByZWdpc3RlciBsaW5lIGRpc2NpcGxpbmUgKGVyciA9ICVkKVxuIjsKKworc3RhdGljIGludCBfX2luaXQgc2l4cGFja19pbml0X2RyaXZlcih2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlwcmludGsobXNnX2Jhbm5lcik7CisKKwkvKiBSZWdpc3RlciB0aGUgcHJvdmlkZWQgbGluZSBwcm90b2NvbCBkaXNjaXBsaW5lICovCisJaWYgKChzdGF0dXMgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl82UEFDSywgJnNwX2xkaXNjKSkgIT0gMCkKKwkJcHJpbnRrKG1zZ19yZWdmYWlsLCBzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgbXNnX3VucmVnZmFpbFtdIF9fZXhpdGRhdGEgPSBLRVJOX0VSUiBcCisJIjZwYWNrOiBjYW4ndCB1bnJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc2l4cGFja19leGl0X2RyaXZlcih2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAoKHJldCA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOXzZQQUNLLCBOVUxMKSkpCisJCXByaW50ayhtc2dfdW5yZWdmYWlsLCByZXQpOworfQorCisvKiBlbmNvZGUgYW4gQVguMjUgcGFja2V0IGludG8gNnBhY2sgKi8KKworc3RhdGljIGludCBlbmNvZGVfc2l4cGFjayh1bnNpZ25lZCBjaGFyICp0eF9idWYsIHVuc2lnbmVkIGNoYXIgKnR4X2J1Zl9yYXcsCisJaW50IGxlbmd0aCwgdW5zaWduZWQgY2hhciB0eF9kZWxheSkKK3sKKwlpbnQgY291bnQgPSAwOworCXVuc2lnbmVkIGNoYXIgY2hlY2tzdW0gPSAwLCBidWZbNDAwXTsKKwlpbnQgcmF3X2NvdW50ID0gMDsKKworCXR4X2J1Zl9yYXdbcmF3X2NvdW50KytdID0gU0lYUF9QUklPX0NNRF9NQVNLIHwgU0lYUF9UWF9NQVNLOworCXR4X2J1Zl9yYXdbcmF3X2NvdW50KytdID0gU0lYUF9TRU9GOworCisJYnVmWzBdID0gdHhfZGVsYXk7CisJZm9yIChjb3VudCA9IDE7IGNvdW50IDwgbGVuZ3RoOyBjb3VudCsrKQorCQlidWZbY291bnRdID0gdHhfYnVmW2NvdW50XTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxlbmd0aDsgY291bnQrKykKKwkJY2hlY2tzdW0gKz0gYnVmW2NvdW50XTsKKwlidWZbbGVuZ3RoXSA9ICh1bnNpZ25lZCBjaGFyKSAweGZmIC0gY2hlY2tzdW07CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPD0gbGVuZ3RoOyBjb3VudCsrKSB7CisJCWlmICgoY291bnQgJSAzKSA9PSAwKSB7CisJCQl0eF9idWZfcmF3W3Jhd19jb3VudCsrXSA9IChidWZbY291bnRdICYgMHgzZik7CisJCQl0eF9idWZfcmF3W3Jhd19jb3VudF0gPSAoKGJ1Zltjb3VudF0gPj4gMikgJiAweDMwKTsKKwkJfSBlbHNlIGlmICgoY291bnQgJSAzKSA9PSAxKSB7CisJCQl0eF9idWZfcmF3W3Jhd19jb3VudCsrXSB8PSAoYnVmW2NvdW50XSAmIDB4MGYpOworCQkJdHhfYnVmX3Jhd1tyYXdfY291bnRdID0JKChidWZbY291bnRdID4+IDIpICYgMHgzYyk7CisJCX0gZWxzZSB7CisJCQl0eF9idWZfcmF3W3Jhd19jb3VudCsrXSB8PSAoYnVmW2NvdW50XSAmIDB4MDMpOworCQkJdHhfYnVmX3Jhd1tyYXdfY291bnQrK10gPSAoYnVmW2NvdW50XSA+PiAyKTsKKwkJfQorCX0KKwlpZiAoKGxlbmd0aCAlIDMpICE9IDIpCisJCXJhd19jb3VudCsrOworCXR4X2J1Zl9yYXdbcmF3X2NvdW50KytdID0gU0lYUF9TRU9GOworCXJldHVybiByYXdfY291bnQ7Cit9CisKKy8qIGRlY29kZSA0IHNpeHBhY2stZW5jb2RlZCBieXRlcyBpbnRvIDMgZGF0YSBieXRlcyAqLworCitzdGF0aWMgdm9pZCBkZWNvZGVfZGF0YShzdHJ1Y3Qgc2l4cGFjayAqc3AsIHVuc2lnbmVkIGNoYXIgaW5ieXRlKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCWlmIChzcC0+cnhfY291bnQgIT0gMykgeworCQlzcC0+cmF3X2J1ZltzcC0+cnhfY291bnQrK10gPSBpbmJ5dGU7CisKKwkJcmV0dXJuOworCX0KKworCWJ1ZiA9IHNwLT5yYXdfYnVmOworCXNwLT5jb29rZWRfYnVmW3NwLT5yeF9jb3VudF9jb29rZWQrK10gPQorCQlidWZbMF0gfCAoKGJ1ZlsxXSA8PCAyKSAmIDB4YzApOworCXNwLT5jb29rZWRfYnVmW3NwLT5yeF9jb3VudF9jb29rZWQrK10gPQorCQkoYnVmWzFdICYgMHgwZikgfCAoKGJ1ZlsyXSA8PCAyKSAmIDB4ZjApOworCXNwLT5jb29rZWRfYnVmW3NwLT5yeF9jb3VudF9jb29rZWQrK10gPQorCQkoYnVmWzJdICYgMHgwMykgfCAoaW5ieXRlIDw8IDIpOworCXNwLT5yeF9jb3VudCA9IDA7Cit9CisKKy8qIGlkZW50aWZ5IGFuZCBleGVjdXRlIGEgNnBhY2sgcHJpb3JpdHkgY29tbWFuZCBieXRlICovCisKK3N0YXRpYyB2b2lkIGRlY29kZV9wcmlvX2NvbW1hbmQoc3RydWN0IHNpeHBhY2sgKnNwLCB1bnNpZ25lZCBjaGFyIGNtZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWw7CisJaW50IGFjdHVhbDsKKworCWNoYW5uZWwgPSBjbWQgJiBTSVhQX0NITl9NQVNLOworCWlmICgoY21kICYgU0lYUF9QUklPX0RBVEFfTUFTSykgIT0gMCkgeyAgICAgLyogaWRsZSA/ICovCisKKwkvKiBSWCBhbmQgRENEIGZsYWdzIGNhbiBvbmx5IGJlIHNldCBpbiB0aGUgc2FtZSBwcmlvIGNvbW1hbmQsCisJICAgaWYgdGhlIERDRCBmbGFnIGhhcyBiZWVuIHNldCB3aXRob3V0IHRoZSBSWCBmbGFnIGluIHRoZSBwcmV2aW91cworCSAgIHByaW8gY29tbWFuZC4gSWYgRENEIGhhcyBub3QgYmVlbiBzZXQgYmVmb3JlLCBzb21ldGhpbmcgaW4gdGhlCisJICAgdHJhbnNtaXNzaW9uIGhhcyBnb25lIHdyb25nLiBJbiB0aGlzIGNhc2UsIFJYIGFuZCBEQ0QgYXJlCisJICAgY2xlYXJlZCBpbiBvcmRlciB0byBwcmV2ZW50IHRoZSBkZWNvZGVfZGF0YSByb3V0aW5lIGZyb20KKwkgICByZWFkaW5nIGZ1cnRoZXIgZGF0YSB0aGF0IG1pZ2h0IGJlIGNvcnJ1cHQuICovCisKKwkJaWYgKCgoc3AtPnN0YXR1cyAmIFNJWFBfRENEX01BU0spID09IDApICYmCisJCQkoKGNtZCAmIFNJWFBfUlhfRENEX01BU0spID09IFNJWFBfUlhfRENEX01BU0spKSB7CisJCQkJaWYgKHNwLT5zdGF0dXMgIT0gMSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIjZwYWNrOiBwcm90b2NvbCB2aW9sYXRpb25cbiIpOworCQkJCWVsc2UKKwkJCQkJc3AtPnN0YXR1cyA9IDA7CisJCQkJY21kICY9ICFTSVhQX1JYX0RDRF9NQVNLOworCQl9CisJCXNwLT5zdGF0dXMgPSBjbWQgJiBTSVhQX1BSSU9fREFUQV9NQVNLOworCX0gZWxzZSB7IC8qIG91dHB1dCB3YXRjaGRvZyBjaGFyIGlmIGlkbGUgKi8KKwkJaWYgKChzcC0+c3RhdHVzMiAhPSAwKSAmJiAoc3AtPmR1cGxleCA9PSAxKSkgeworCQkJc3AtPmxlZF9zdGF0ZSA9IDB4NzA7CisJCQlzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksICZzcC0+bGVkX3N0YXRlLCAxKTsKKwkJCXNwLT50eF9lbmFibGUgPSAxOworCQkJYWN0dWFsID0gc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCBzcC0+eGJ1ZmYsIHNwLT5zdGF0dXMyKTsKKwkJCXNwLT54bGVmdCAtPSBhY3R1YWw7CisJCQlzcC0+eGhlYWQgKz0gYWN0dWFsOworCQkJc3AtPmxlZF9zdGF0ZSA9IDB4NjA7CisJCQlzcC0+c3RhdHVzMiA9IDA7CisKKwkJfQorCX0KKworCS8qIG5lZWRlZCB0byB0cmlnZ2VyIHRoZSBUTkMgd2F0Y2hkb2cgKi8KKwlzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksICZzcC0+bGVkX3N0YXRlLCAxKTsKKworICAgICAgICAvKiBpZiB0aGUgc3RhdGUgYnl0ZSBoYXMgYmVlbiByZWNlaXZlZCwgdGhlIFROQyBpcyBwcmVzZW50LAorICAgICAgICAgICBzbyB0aGUgcmVzeW5jIHRpbWVyIGNhbiBiZSByZXNldC4gKi8KKworCWlmIChzcC0+dG5jX3N0YXRlID09IFROQ19JTl9TWU5DKSB7CisJCWRlbF90aW1lcigmc3AtPnJlc3luY190KTsKKwkJc3AtPnJlc3luY190LmRhdGEJPSAodW5zaWduZWQgbG9uZykgc3A7CisJCXNwLT5yZXN5bmNfdC5mdW5jdGlvbgk9IHJlc3luY190bmM7CisJCXNwLT5yZXN5bmNfdC5leHBpcmVzCT0gamlmZmllcyArIFNJWFBfSU5JVF9SRVNZTkNfVElNRU9VVDsKKwkJYWRkX3RpbWVyKCZzcC0+cmVzeW5jX3QpOworCX0KKworCXNwLT5zdGF0dXMxID0gY21kICYgU0lYUF9QUklPX0RBVEFfTUFTSzsKK30KKworLyogaWRlbnRpZnkgYW5kIGV4ZWN1dGUgYSBzdGFuZGFyZCA2cGFjayBjb21tYW5kIGJ5dGUgKi8KKworc3RhdGljIHZvaWQgZGVjb2RlX3N0ZF9jb21tYW5kKHN0cnVjdCBzaXhwYWNrICpzcCwgdW5zaWduZWQgY2hhciBjbWQpCit7CisJdW5zaWduZWQgY2hhciBjaGVja3N1bSA9IDAsIHJlc3QgPSAwLCBjaGFubmVsOworCXNob3J0IGk7CisKKwljaGFubmVsID0gY21kICYgU0lYUF9DSE5fTUFTSzsKKwlzd2l0Y2ggKGNtZCAmIFNJWFBfQ01EX01BU0spIHsgICAgIC8qIG5vcm1hbCBjb21tYW5kICovCisJY2FzZSBTSVhQX1NFT0Y6CisJCWlmICgoc3AtPnJ4X2NvdW50ID09IDApICYmIChzcC0+cnhfY291bnRfY29va2VkID09IDApKSB7CisJCQlpZiAoKHNwLT5zdGF0dXMgJiBTSVhQX1JYX0RDRF9NQVNLKSA9PQorCQkJCVNJWFBfUlhfRENEX01BU0spIHsKKwkJCQlzcC0+bGVkX3N0YXRlID0gMHg2ODsKKwkJCQlzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksICZzcC0+bGVkX3N0YXRlLCAxKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNwLT5sZWRfc3RhdGUgPSAweDYwOworCQkJLyogZmlsbCB0cmFpbGluZyBieXRlcyB3aXRoIHplcm9lcyAqLworCQkJc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCAmc3AtPmxlZF9zdGF0ZSwgMSk7CisJCQlyZXN0ID0gc3AtPnJ4X2NvdW50OworCQkJaWYgKHJlc3QgIT0gMCkKKwkJCQkgZm9yIChpID0gcmVzdDsgaSA8PSAzOyBpKyspCisJCQkJCWRlY29kZV9kYXRhKHNwLCAwKTsKKwkJCWlmIChyZXN0ID09IDIpCisJCQkJc3AtPnJ4X2NvdW50X2Nvb2tlZCAtPSAyOworCQkJZWxzZSBpZiAocmVzdCA9PSAzKQorCQkJCXNwLT5yeF9jb3VudF9jb29rZWQgLT0gMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzcC0+cnhfY291bnRfY29va2VkOyBpKyspCisJCQkJY2hlY2tzdW0gKz0gc3AtPmNvb2tlZF9idWZbaV07CisJCQlpZiAoY2hlY2tzdW0gIT0gU0lYUF9DSEtTVU0pIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiNnBhY2s6IGJhZCBjaGVja3N1bSAlMi4yeFxuIiwgY2hlY2tzdW0pOworCQkJfSBlbHNlIHsKKwkJCQlzcC0+cmNvdW50ID0gc3AtPnJ4X2NvdW50X2Nvb2tlZC0yOworCQkJCXNwX2J1bXAoc3AsIDApOworCQkJfQorCQkJc3AtPnJ4X2NvdW50X2Nvb2tlZCA9IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTSVhQX1RYX1VSVU46IHByaW50ayhLRVJOX0RFQlVHICI2cGFjazogVFggdW5kZXJydW5cbiIpOworCQlicmVhazsKKwljYXNlIFNJWFBfUlhfT1JVTjogcHJpbnRrKEtFUk5fREVCVUcgIjZwYWNrOiBSWCBvdmVycnVuXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBTSVhQX1JYX0JVRl9PVkw6CisJCXByaW50ayhLRVJOX0RFQlVHICI2cGFjazogUlggYnVmZmVyIG92ZXJmbG93XG4iKTsKKwl9Cit9CisKKy8qIGRlY29kZSBhIDZwYWNrIHBhY2tldCAqLworCitzdGF0aWMgdm9pZAorc2l4cGFja19kZWNvZGUoc3RydWN0IHNpeHBhY2sgKnNwLCB1bnNpZ25lZCBjaGFyICpwcmVfcmJ1ZmYsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBjaGFyIGluYnl0ZTsKKwlpbnQgY291bnQxOworCisJZm9yIChjb3VudDEgPSAwOyBjb3VudDEgPCBjb3VudDsgY291bnQxKyspIHsKKwkJaW5ieXRlID0gcHJlX3JidWZmW2NvdW50MV07CisJCWlmIChpbmJ5dGUgPT0gU0lYUF9GT1VORF9UTkMpIHsKKwkJCXRuY19zZXRfc3luY19zdGF0ZShzcCwgVE5DX0lOX1NZTkMpOworCQkJZGVsX3RpbWVyKCZzcC0+cmVzeW5jX3QpOworCQl9CisJCWlmICgoaW5ieXRlICYgU0lYUF9QUklPX0NNRF9NQVNLKSAhPSAwKQorCQkJZGVjb2RlX3ByaW9fY29tbWFuZChzcCwgaW5ieXRlKTsKKwkJZWxzZSBpZiAoKGluYnl0ZSAmIFNJWFBfU1REX0NNRF9NQVNLKSAhPSAwKQorCQkJZGVjb2RlX3N0ZF9jb21tYW5kKHNwLCBpbmJ5dGUpOworCQllbHNlIGlmICgoc3AtPnN0YXR1cyAmIFNJWFBfUlhfRENEX01BU0spID09IFNJWFBfUlhfRENEX01BU0spCisJCQlkZWNvZGVfZGF0YShzcCwgaW5ieXRlKTsKKwl9Cit9CisKK01PRFVMRV9BVVRIT1IoIlJhbGYgQmFlY2hsZSBETzFHUkIgPHJhbGZAbGludXgtbWlwcy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjZwYWNrIGRyaXZlciBmb3IgQVguMjUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19MRElTQyhOXzZQQUNLKTsKKworbW9kdWxlX2luaXQoc2l4cGFja19pbml0X2RyaXZlcik7Cittb2R1bGVfZXhpdChzaXhwYWNrX2V4aXRfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL0tjb25maWcgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDY4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9LY29uZmlnCkBAIC0wLDAgKzEsMTkxIEBACitjb25maWcgTUtJU1MKKwl0cmlzdGF0ZSAiU2VyaWFsIHBvcnQgS0lTUyBkcml2ZXIiCisJZGVwZW5kcyBvbiBBWDI1ICYmIEJST0tFTl9PTl9TTVAKKwktLS1oZWxwLS0tCisJICBLSVNTIGlzIGEgcHJvdG9jb2wgdXNlZCBmb3IgdGhlIGV4Y2hhbmdlIG9mIGRhdGEgYmV0d2VlbiBhIGNvbXB1dGVyCisJICBhbmQgYSBUZXJtaW5hbCBOb2RlIENvbnRyb2xsZXIgKGEgc21hbGwgZW1iZWRkZWQgc3lzdGVtIGNvbW1vbmx5CisJICB1c2VkIGZvciBuZXR3b3JraW5nIG92ZXIgQVguMjUgYW1hdGV1ciByYWRpbyBjb25uZWN0aW9uczsgaXQKKwkgIGNvbm5lY3RzIHRoZSBjb21wdXRlcidzIHNlcmlhbCBwb3J0IHdpdGggdGhlIHJhZGlvJ3MgbWljcm9waG9uZQorCSAgaW5wdXQgYW5kIHNwZWFrZXIgb3V0cHV0KS4KKworCSAgQWx0aG91Z2ggS0lTUyBpcyBsZXNzIGFkdmFuY2VkIHRoYW4gdGhlIDZwYWNrIHByb3RvY29sLCBpdCBoYXMKKwkgIHRoZSBhZHZhbnRhZ2UgdGhhdCBpdCBpcyBhbHJlYWR5IHN1cHBvcnRlZCBieSBtb3N0IG1vZGVybiBUTkNzCisJICB3aXRob3V0IHRoZSBuZWVkIGZvciBhIGZpcm13YXJlIHVwZ3JhZGUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1raXNzLgorCitjb25maWcgNlBBQ0sKKwl0cmlzdGF0ZSAiU2VyaWFsIHBvcnQgNlBBQ0sgZHJpdmVyIgorCWRlcGVuZHMgb24gQVgyNSAmJiBCUk9LRU5fT05fU01QCisJLS0taGVscC0tLQorCSAgNnBhY2sgaXMgYSB0cmFuc21pc3Npb24gcHJvdG9jb2wgZm9yIHRoZSBkYXRhIGV4Y2hhbmdlIGJldHdlZW4geW91cgorCSAgUEMgYW5kIHlvdXIgVE5DICh0aGUgVGVybWluYWwgTm9kZSBDb250cm9sbGVyIGFjdHMgYXMgYSBraW5kIG9mCisJICBtb2RlbSBjb25uZWN0aW5nIHlvdXIgY29tcHV0ZXIncyBzZXJpYWwgcG9ydCB0byB5b3VyIHJhZGlvJ3MKKwkgIG1pY3JvcGhvbmUgaW5wdXQgYW5kIHNwZWFrZXIgb3V0cHV0KS4gVGhpcyBwcm90b2NvbCBjYW4gYmUgdXNlZCBhcworCSAgYW4gYWx0ZXJuYXRpdmUgdG8gS0lTUyBmb3IgbmV0d29ya2luZyBvdmVyIEFYLjI1IGFtYXRldXIgcmFkaW8KKwkgIGNvbm5lY3Rpb25zLCBidXQgaXQgaGFzIHNvbWUgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eS4KKworCSAgTm90ZSB0aGF0IHRoaXMgZHJpdmVyIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgbWlnaHQgY2F1c2UKKwkgIHByb2JsZW1zLiBGb3IgZGV0YWlscyBhYm91dCB0aGUgZmVhdHVyZXMgYW5kIHRoZSB1c2FnZSBvZiB0aGUKKwkgIGRyaXZlciwgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvNnBhY2sudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgNnBhY2suCisKK2NvbmZpZyBCUFFFVEhFUgorCXRyaXN0YXRlICJCUFEgRXRoZXJuZXQgZHJpdmVyIgorCWRlcGVuZHMgb24gQVgyNQorCWhlbHAKKwkgIEFYLjI1IGlzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBjb21wdXRlciBjb21tdW5pY2F0aW9uIG92ZXIgYW1hdGV1cgorCSAgcmFkaW8uIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNlbmQgYW5kIHJlY2VpdmUgQVguMjUKKwkgIHRyYWZmaWMgb3ZlciBFdGhlcm5ldCAoYWxzbyBjYWxsZWQgIkJQUSBBWC4yNSIpLCB3aGljaCBjb3VsZCBiZQorCSAgdXNlZnVsIGlmIHNvbWUgb3RoZXIgY29tcHV0ZXIgb24geW91ciBsb2NhbCBuZXR3b3JrIGhhcyBhIGRpcmVjdAorCSAgYW1hdGV1ciByYWRpbyBjb25uZWN0aW9uLgorCitjb25maWcgRE1BU0NDCisJdHJpc3RhdGUgIkhpZ2gtc3BlZWQgKERNQSkgU0NDIGRyaXZlciBmb3IgQVguMjUiCisJZGVwZW5kcyBvbiBJU0EgJiYgQVgyNSAmJiBCUk9LRU5fT05fU01QCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgaGlnaC1zcGVlZCBTQ0MgYm9hcmRzLCBpLmUuIHRob3NlIHN1cHBvcnRpbmcKKwkgIERNQSBvbiBvbmUgcG9ydC4gWW91IHVzdWFsbHkgdXNlIHRob3NlIGJvYXJkcyB0byBjb25uZWN0IHlvdXIKKwkgIGNvbXB1dGVyIHRvIGFuIGFtYXRldXIgcmFkaW8gbW9kZW0gKHN1Y2ggYXMgdGhlIFdBNERTWSA1NmticHMKKwkgIG1vZGVtKSwgaW4gb3JkZXIgdG8gc2VuZCBhbmQgcmVjZWl2ZSBBWC4yNSBwYWNrZXQgcmFkaW8gbmV0d29yaworCSAgdHJhZmZpYy4KKworCSAgQ3VycmVudGx5LCB0aGlzIGRyaXZlciBzdXBwb3J0cyBPdHRhd2EgUEkvUEkyLCBQYWNjb21tL0dyYWNpbGlzCisJICBQYWNrZVR3aW4sIGFuZCBTNVNDQy9ETUEgYm9hcmRzLiBUaGV5IGFyZSBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LgorCSAgSWYgeW91IGhhdmUgb25lIG9mIHRoZXNlIGNhcmRzLCBzYXkgWSBoZXJlIGFuZCByZWFkIHRoZSBBWDI1LUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVGhpcyBkcml2ZXIgY2FuIG9wZXJhdGUgbXVsdGlwbGUgYm9hcmRzIHNpbXVsdGFuZW91c2x5LiBJZiB5b3UKKwkgIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUgKGJ5IHNheWluZyBNIGluc3RlYWQgb2YgWSksIGl0IHdpbGwgYmUgY2FsbGVkCisJICBkbWFzY2MuIElmIHlvdSBkb24ndCBwYXNzIGFueSBwYXJhbWV0ZXIgdG8gdGhlIGRyaXZlciwgYWxsCisJICBwb3NzaWJsZSBJL08gYWRkcmVzc2VzIGFyZSBwcm9iZWQuIFRoaXMgY291bGQgaXJyaXRhdGUgb3RoZXIgZGV2aWNlcworCSAgdGhhdCBhcmUgY3VycmVudGx5IG5vdCBpbiB1c2UuIFlvdSBtYXkgc3BlY2lmeSB0aGUgbGlzdCBvZiBhZGRyZXNzZXMKKwkgIHRvIGJlIHByb2JlZCBieSAiZG1hc2NjPWFkZHIxLGFkZHIyLC4uLiIgKHdoZW4gY29tcGlsZWQgaW50byB0aGUKKwkgIGtlcm5lbCBpbWFnZSkgb3IgImlvPWFkZHIxLGFkZHIyLC4uLiIgKHdoZW4gbG9hZGVkIGFzIGEgbW9kdWxlKS4gVGhlCisJICBuZXR3b3JrIGludGVyZmFjZXMgd2lsbCBiZSBjYWxsZWQgZG1hc2NjMCBhbmQgZG1hc2NjMSBmb3IgdGhlIGJvYXJkCisJICBkZXRlY3RlZCBmaXJzdCwgZG1hc2NjMiBhbmQgZG1hc2NjMyBmb3IgdGhlIHNlY29uZCBvbmUsIGFuZCBzbyBvbi4KKworCSAgQmVmb3JlIHlvdSBjb25maWd1cmUgZWFjaCBpbnRlcmZhY2Ugd2l0aCBpZmNvbmZpZywgeW91IE1VU1Qgc2V0CisJICBjZXJ0YWluIHBhcmFtZXRlcnMsIHN1Y2ggYXMgY2hhbm5lbCBhY2Nlc3MgdGltaW5nLCBjbG9jayBtb2RlLCBhbmQKKwkgIERNQSBjaGFubmVsLiBUaGlzIGlzIGFjY29tcGxpc2hlZCB3aXRoIGEgc21hbGwgdXRpbGl0eSBwcm9ncmFtLAorCSAgZG1hc2NjX2NmZywgYXZhaWxhYmxlIGF0CisJICA8aHR0cDovL2NhY29mb25peC5udC50dXdpZW4uYWMuYXQvfm9lMWtpYi9MaW51eC8+LiBQbGVhc2UgYmUgc3VyZSB0bworCSAgZ2V0IGF0IGxlYXN0IHZlcnNpb24gMS4yNyBvZiBkbWFzY2NfY2ZnLCBhcyBvbGRlciB2ZXJzaW9ucyB3aWxsIG5vdAorCSAgd29yayB3aXRoIHRoZSBjdXJyZW50IGRyaXZlci4KKworY29uZmlnIFNDQworCXRyaXN0YXRlICJaODUzMCBTQ0MgZHJpdmVyIgorCWRlcGVuZHMgb24gSVNBICYmIEFYMjUKKwktLS1oZWxwLS0tCisJICBUaGVzZSBjYXJkcyBhcmUgdXNlZCB0byBjb25uZWN0IHlvdXIgTGludXggYm94IHRvIGFuIGFtYXRldXIgcmFkaW8KKwkgIGluIG9yZGVyIHRvIGNvbW11bmljYXRlIHdpdGggb3RoZXIgY29tcHV0ZXJzLiBJZiB5b3Ugd2FudCB0byB1c2UKKwkgIHRoaXMsIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3o4NTMwZHJ2LnR4dD4gYW5kIHRoZQorCSAgQVgyNS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uIEFsc28gbWFrZSBzdXJlIHRvIHNheSBZCisJICB0byAiQW1hdGV1ciBSYWRpbyBBWC4yNSBMZXZlbCAyIiBzdXBwb3J0LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzY2MuCisKK2NvbmZpZyBTQ0NfREVMQVkKKwlib29sICJhZGRpdGlvbmFsIGRlbGF5IGZvciBQQTBIWlAgT3B0b1NDQyBjb21wYXRpYmxlIGJvYXJkcyIKKwlkZXBlbmRzIG9uIFNDQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCB0aGUgU0NDIGRyaXZlciBub3QKKwkgIHdvcmtpbmcgcHJvcGVybHk7IHBsZWFzZSByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvejg1MzBkcnYudHh0PiBmb3IgZGV0YWlscy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDQ19UUlhFQ0hPCisJYm9vbCAic3VwcG9ydCBmb3IgVFJYIHRoYXQgZmVlZGJhY2sgdGhlIHR4IHNpZ25hbCB0byByeCIKKwlkZXBlbmRzIG9uIFNDQworCWhlbHAKKwkgIFNvbWUgdHJhbnNtaXR0ZXJzIGZlZWQgdGhlIHRyYW5zbWl0dGVkIHNpZ25hbCBiYWNrIHRvIHRoZSByZWNlaXZlCisJICBsaW5lLiAgU2F5IFkgaGVyZSB0byBmb2lsIHRoaXMgYnkgZXhwbGljaXRseSBkaXNhYmxpbmcgdGhlIHJlY2VpdmVyCisJICBkdXJpbmcgZGF0YSB0cmFuc21pc3Npb24uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgWS4KKworY29uZmlnIEJBWUNPTV9TRVJfRkRYCisJdHJpc3RhdGUgIkJBWUNPTSBzZXIxMiBmdWxsZHVwbGV4IGRyaXZlciBmb3IgQVguMjUiCisJZGVwZW5kcyBvbiBBWDI1CisJc2VsZWN0IENSQ19DQ0lUVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgb25lIG9mIHR3byBkcml2ZXJzIGZvciBCYXljb20gc3R5bGUgc2ltcGxlIGFtYXRldXIgcmFkaW8KKwkgIG1vZGVtcyB0aGF0IGNvbm5lY3QgdG8gYSBzZXJpYWwgaW50ZXJmYWNlLiBUaGUgZHJpdmVyIHN1cHBvcnRzIHRoZQorCSAgc2VyMTIgZGVzaWduIGluIGZ1bGwtZHVwbGV4IG1vZGUuIEluIGFkZGl0aW9uLCBpdCBhbGxvd3MgdGhlCisJICBiYXVkcmF0ZSB0byBiZSBzZXQgYmV0d2VlbiAzMDAgYW5kIDQ4MDAgYmF1ZCAoaG93ZXZlciBub3QgYWxsIG1vZGVtcworCSAgc3VwcG9ydCBhbGwgYmF1ZHJhdGVzKS4gVGhpcyBpcyB0aGUgcHJlZmVycmVkIGRyaXZlci4gVGhlIG5leHQKKwkgIGRyaXZlciwgIkJBWUNPTSBzZXIxMiBoYWxmLWR1cGxleCBkcml2ZXIgZm9yIEFYLjI1IiBpcyB0aGUgb2xkCisJICBkcml2ZXIgYW5kIHN0aWxsIHByb3ZpZGVkIGluIGNhc2UgdGhpcyBkcml2ZXIgZG9lcyBub3Qgd29yayB3aXRoCisJICB5b3VyIHNlcmlhbCBpbnRlcmZhY2UgY2hpcC4gVG8gY29uZmlndXJlIHRoZSBkcml2ZXIsIHVzZSB0aGUgc2V0aGRsYworCSAgdXRpbGl0eSBhdmFpbGFibGUgaW4gdGhlIHN0YW5kYXJkIGF4MjUgdXRpbGl0aWVzIHBhY2thZ2UuIEZvcgorCSAgaW5mb3JtYXRpb24gb24gdGhlIG1vZGVtcywgc2VlIDxodHRwOi8vd3d3LmJheWNvbS5kZS8+IGFuZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JheWNvbS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBiYXljb21fc2VyX2ZkeC4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCisKK2NvbmZpZyBCQVlDT01fU0VSX0hEWAorCXRyaXN0YXRlICJCQVlDT00gc2VyMTIgaGFsZmR1cGxleCBkcml2ZXIgZm9yIEFYLjI1IgorCWRlcGVuZHMgb24gQVgyNQorCXNlbGVjdCBDUkNfQ0NJVFQKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIG9uZSBvZiB0d28gZHJpdmVycyBmb3IgQmF5Y29tIHN0eWxlIHNpbXBsZSBhbWF0ZXVyIHJhZGlvCisJICBtb2RlbXMgdGhhdCBjb25uZWN0IHRvIGEgc2VyaWFsIGludGVyZmFjZS4gVGhlIGRyaXZlciBzdXBwb3J0cyB0aGUKKwkgIHNlcjEyIGRlc2lnbiBpbiBmdWxsLWR1cGxleCBtb2RlLiBUaGlzIGlzIHRoZSBvbGQgZHJpdmVyLiAgSXQgaXMKKwkgIHN0aWxsIHByb3ZpZGVkIGluIGNhc2UgeW91ciBzZXJpYWwgaW50ZXJmYWNlIGNoaXAgZG9lcyBub3Qgd29yayB3aXRoCisJICB0aGUgZnVsbC1kdXBsZXggZHJpdmVyLiBUaGlzIGRyaXZlciBpcyBkZXByZWNpYXRlZC4gIFRvIGNvbmZpZ3VyZQorCSAgdGhlIGRyaXZlciwgdXNlIHRoZSBzZXRoZGxjIHV0aWxpdHkgYXZhaWxhYmxlIGluIHRoZSBzdGFuZGFyZCBheDI1CisJICB1dGlsaXRpZXMgcGFja2FnZS4gRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBtb2RlbXMsIHNlZQorCSAgPGh0dHA6Ly93d3cuYmF5Y29tLmRlLz4gYW5kCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYmF5Y29tLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGJheWNvbV9zZXJfaGR4LiAgVGhpcyBpcyByZWNvbW1lbmRlZC4KKworY29uZmlnIEJBWUNPTV9QQVIKKwl0cmlzdGF0ZSAiQkFZQ09NIHBpY3BhciBhbmQgcGFyOTYgZHJpdmVyIGZvciBBWC4yNSIKKwlkZXBlbmRzIG9uIFBBUlBPUlQgJiYgQVgyNQorCXNlbGVjdCBDUkNfQ0NJVFQKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBCYXljb20gc3R5bGUgc2ltcGxlIGFtYXRldXIgcmFkaW8gbW9kZW1zIHRoYXQKKwkgIGNvbm5lY3QgdG8gYSBwYXJhbGxlbCBpbnRlcmZhY2UuIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlIHBpY3BhciBhbmQKKwkgIHBhcjk2IGRlc2lnbnMuIFRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyLCB1c2UgdGhlIHNldGhkbGMgdXRpbGl0eQorCSAgYXZhaWxhYmxlIGluIHRoZSBzdGFuZGFyZCBheDI1IHV0aWxpdGllcyBwYWNrYWdlLiBGb3IgaW5mb3JtYXRpb24gb24KKwkgIHRoZSBtb2RlbXMsIHNlZSA8aHR0cDovL3d3dy5iYXljb20uZGUvPiBhbmQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9iYXljb20udHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYmF5Y29tX3Bhci4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCisKK2NvbmZpZyBCQVlDT01fRVBQCisJdHJpc3RhdGUgIkJBWUNPTSBlcHAgZHJpdmVyIGZvciBBWC4yNSIKKwlkZXBlbmRzIG9uIFBBUlBPUlQgJiYgQVgyNSAmJiAhNjRCSVQKKwlzZWxlY3QgQ1JDX0NDSVRUCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgQmF5Y29tIHN0eWxlIHNpbXBsZSBhbWF0ZXVyIHJhZGlvIG1vZGVtcyB0aGF0CisJICBjb25uZWN0IHRvIGEgcGFyYWxsZWwgaW50ZXJmYWNlLiBUaGUgZHJpdmVyIHN1cHBvcnRzIHRoZSBFUFAKKwkgIGRlc2lnbnMuIFRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyLCB1c2UgdGhlIHNldGhkbGMgdXRpbGl0eSBhdmFpbGFibGUKKwkgIGluIHRoZSBzdGFuZGFyZCBheDI1IHV0aWxpdGllcyBwYWNrYWdlLiBGb3IgaW5mb3JtYXRpb24gb24gdGhlCisJICBtb2RlbXMsIHNlZSA8aHR0cDovL3d3dy5iYXljb20uZGUvPiBhbmQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9iYXljb20udHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYmF5Y29tX2VwcC4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCisKK2NvbmZpZyBZQU0KKwl0cmlzdGF0ZSAiWUFNIGRyaXZlciBmb3IgQVguMjUiCisJZGVwZW5kcyBvbiBBWDI1CisJaGVscAorCSAgVGhlIFlBTSBpcyBhIG1vZGVtIGZvciBwYWNrZXQgcmFkaW8gd2hpY2ggY29ubmVjdHMgdG8gdGhlIHNlcmlhbAorCSAgcG9ydCBhbmQgaW5jbHVkZXMgc29tZSBvZiB0aGUgZnVuY3Rpb25zIG9mIGEgVGVybWluYWwgTm9kZQorCSAgQ29udHJvbGxlci4gSWYgeW91IGhhdmUgb25lIG9mIHRob3NlLCBzYXkgWSBoZXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB5YW0uCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlZjg2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL01ha2VmaWxlCkBAIC0wLDAgKzEsMjIgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBBWC4yNSBhbmQgSEZNT0RFTSBkZXZpY2UgZHJpdmVycy4KKyMKKyMKKyMgMTk5NzExMzAgCU1vdmVkIHRoZSBhbWF0ZXVyIHJhZGlvIHJlbGF0ZWQgbmV0d29yayBkcml2ZXJzIGZyb20gCisjCQlkcml2ZXJzL25ldC8gdG8gZHJpdmVycy9oYW1yYWRpbyBmb3IgZWFzaWVyIG1haW50YWluYW5jZS4KKyMgICAgICAgICAgICAgICBKb2VyZyBSZXV0ZXIgREwxQktFIDxqcmV1dGVyQHlhaW5hLmRlPgorIworIyAyMDAwMDgwNglSZXdyaXR0ZW4gdG8gdXNlIGxpc3RzIGluc3RlYWQgb2YgaWYtc3RhdGVtZW50cy4KKyMJCUNocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KKyMKKworb2JqLSQoQ09ORklHX0RNQVNDQykJCSs9IGRtYXNjYy5vCitvYmotJChDT05GSUdfU0NDKQkJKz0gc2NjLm8KK29iai0kKENPTkZJR19NS0lTUykJCSs9IG1raXNzLm8KK29iai0kKENPTkZJR182UEFDSykJCSs9IDZwYWNrLm8KK29iai0kKENPTkZJR19ZQU0pCQkrPSB5YW0ubworb2JqLSQoQ09ORklHX0JQUUVUSEVSKQkJKz0gYnBxZXRoZXIubworb2JqLSQoQ09ORklHX0JBWUNPTV9TRVJfRkRYKQkrPSBiYXljb21fc2VyX2ZkeC5vCWhkbGNkcnYubworb2JqLSQoQ09ORklHX0JBWUNPTV9TRVJfSERYKQkrPSBiYXljb21fc2VyX2hkeC5vCWhkbGNkcnYubworb2JqLSQoQ09ORklHX0JBWUNPTV9QQVIpCSs9IGJheWNvbV9wYXIubwkJaGRsY2Rydi5vCitvYmotJChDT05GSUdfQkFZQ09NX0VQUCkJKz0gYmF5Y29tX2VwcC5vCQloZGxjZHJ2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9lcHAuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9lcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGNiODdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX2VwcC5jCkBAIC0wLDAgKzEsMTM4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJYmF5Y29tX2VwcC5jICAtLSBiYXljb20gZXBwIHJhZGlvIG1vZGVtIGRyaXZlci4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMAorICogICAgICAgICAgVGhvbWFzIFNhaWxlciAoc2FpbGVyQGlmZS5lZS5ldGh6LmNoKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBHUEwgYWxsb3dzIHlvdSB0byB1c2UgdGhlIGRyaXZlciwgTk9UIHRoZSByYWRpby4KKyAqICBJbiBvcmRlciB0byB1c2UgdGhlIHJhZGlvLCB5b3UgbmVlZCBhIGxpY2Vuc2UgZnJvbSB0aGUgY29tbXVuaWNhdGlvbnMKKyAqICBhdXRob3JpdHkgb2YgeW91ciBjb3VudHJ5LgorICoKKyAqCisgKiAgSGlzdG9yeToKKyAqICAgMC4xICB4eC54eC4xOTk4ICBJbml0aWFsIHZlcnNpb24gYnkgTWF0dGhpYXMgV2Vsd2Fyc2t5IChkZzJmZWYpCisgKiAgIDAuMiAgMjEuMDQuMTk5OCAgTWFzc2l2ZSByZXdvcmsgYnkgVGhvbWFzIFNhaWxlcgorICogICAgICAgICAgICAgICAgICAgIEludGVncmF0ZWQgRlBHQSBFUFAgbW9kZW0gY29uZmlndXJhdGlvbiByb3V0aW5lcworICogICAwLjMgIDExLjA1LjE5OTggIFRvb2sgRlBHQSBjb25maWcgb3V0IGFuZCBtb3ZlZCBpdCBpbnRvIGEgc2VwYXJhdGUgcHJvZ3JhbQorICogICAwLjQgIDI2LjA3LjE5OTkgIEFkYXB0ZWQgdG8gbmV3IGxvd2xldmVsIHBhcnBvcnQgZHJpdmVyIGludGVyZmFjZQorICogICAwLjUgIDAzLjA4LjE5OTkgIGFkYXB0IHRvIExpbnVzJyBuZXcgX19zZXR1cC9fX2luaXRjYWxsCisgKiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCBzb21lIHByZS0yLjIga2VybmVsIGNvbXBhdGliaWxpdHkgY3J1ZnQKKyAqICAgMC42ICAxMC4wOC4xOTk5ICBDaGVjayBpZiBwYXJwb3J0IGNhbiBkbyBTUFAgYW5kIGlzIHNhZmUgdG8gYWNjZXNzIGR1cmluZyBpbnRlcnJ1cHQgY29udGV4dHMKKyAqICAgMC43ICAxMi4wMi4yMDAwICBhZGFwdGVkIHRvIHNvZnRuZXQgZHJpdmVyIGludGVyZmFjZQorICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjZHJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYmF5Y29tLmg+CisjaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisvKiBwcm90b3R5cGVzIGZvciBheDI1X2VuY2Fwc3VsYXRlIGFuZCBheDI1X3JlYnVpbGRfaGVhZGVyICovCisjaW5jbHVkZSA8bmV0L2F4MjUuaD4gCisjZW5kaWYgLyogQ09ORklHX0FYMjUgfHwgQ09ORklHX0FYMjVfTU9EVUxFICovCisjaW5jbHVkZSA8bGludXgvY3JjLWNjaXR0Lmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEJBWUNPTV9ERUJVRworI2RlZmluZSBCQVlDT01fTUFHSUMgMTk3MzA1MTAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyIHBhcmFub2lhX3N0cltdID0gS0VSTl9FUlIgCisJImJheWNvbV9lcHA6IGJhZCBtYWdpYyBudW1iZXIgZm9yIGhkbGNkcnZfc3RhdGUgc3RydWN0IGluIHJvdXRpbmUgJXNcbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGJjX2Rydm5hbWVbXSA9ICJiYXljb21fZXBwIjsKK3N0YXRpYyBjb25zdCBjaGFyIGJjX2RydmluZm9bXSA9IEtFUk5fSU5GTyAiYmF5Y29tX2VwcDogKEMpIDE5OTgtMjAwMCBUaG9tYXMgU2FpbGVyLCBIQjlKTlgvQUU0V0FcbiIKK0tFUk5fSU5GTyAiYmF5Y29tX2VwcDogdmVyc2lvbiAwLjcgY29tcGlsZWQgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTlJfUE9SVFMgNAorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmJheWNvbV9kZXZpY2VbTlJfUE9SVFNdOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogRVBQIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBFUFBfRENEQklUICAgICAgMHg4MAorI2RlZmluZSBFUFBfUFRUQklUICAgICAgMHgwOAorI2RlZmluZSBFUFBfTlJFRiAgICAgICAgMHgwMQorI2RlZmluZSBFUFBfTlJBRUYgICAgICAgMHgwMgorI2RlZmluZSBFUFBfTlJIRiAgICAgICAgMHgwNAorI2RlZmluZSBFUFBfTlRIRiAgICAgICAgMHgyMAorI2RlZmluZSBFUFBfTlRBRUYgICAgICAgMHgxMAorI2RlZmluZSBFUFBfTlRFRiAgICAgICAgRVBQX1BUVEJJVAorCisvKiBFUFAgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBFUFBfVFhfRklGT19FTkFCTEUgMHgxMAorI2RlZmluZSBFUFBfUlhfRklGT19FTkFCTEUgMHgwOAorI2RlZmluZSBFUFBfTU9ERU1fRU5BQkxFICAgMHgyMAorI2RlZmluZSBFUFBfTEVEUyAgICAgICAgICAgMHhDMAorI2RlZmluZSBFUFBfSVJRX0VOQUJMRSAgICAgMHgxMAorCisvKiBMUFQgcmVnaXN0ZXJzICovCisjZGVmaW5lIExQVFJFR19FQ09OVFJPTCAgICAgICAweDQwMgorI2RlZmluZSBMUFRSRUdfQ09ORklHQiAgICAgICAgMHg0MDEKKyNkZWZpbmUgTFBUUkVHX0NPTkZJR0EgICAgICAgIDB4NDAwCisjZGVmaW5lIExQVFJFR19FUFBEQVRBICAgICAgICAweDAwNAorI2RlZmluZSBMUFRSRUdfRVBQQUREUiAgICAgICAgMHgwMDMKKyNkZWZpbmUgTFBUUkVHX0NPTlRST0wgICAgICAgIDB4MDAyCisjZGVmaW5lIExQVFJFR19TVEFUVVMgICAgICAgICAweDAwMQorI2RlZmluZSBMUFRSRUdfREFUQSAgICAgICAgICAgMHgwMDAKKworLyogTFBUIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTFBUQ1RSTF9QUk9HUkFNICAgICAgIDB4MDQgICAvKiAwIHRvIHJlcHJvZ3JhbSAqLworI2RlZmluZSBMUFRDVFJMX1dSSVRFICAgICAgICAgMHgwMQorI2RlZmluZSBMUFRDVFJMX0FERFJTVEIgICAgICAgMHgwOAorI2RlZmluZSBMUFRDVFJMX0RBVEFTVEIgICAgICAgMHgwMgorI2RlZmluZSBMUFRDVFJMX0lOVEVOICAgICAgICAgMHgxMAorCisvKiBMUFQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIExQVFNUQVRfU0hJRlRfTklOVFIgICA2CisjZGVmaW5lIExQVFNUQVRfV0FJVCAgICAgICAgICAweDgwCisjZGVmaW5lIExQVFNUQVRfTklOVFIgICAgICAgICAoMTw8TFBUU1RBVF9TSElGVF9OSU5UUikKKyNkZWZpbmUgTFBUU1RBVF9QRSAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgTFBUU1RBVF9ET05FICAgICAgICAgIDB4MTAKKyNkZWZpbmUgTFBUU1RBVF9ORVJST1IgICAgICAgIDB4MDgKKyNkZWZpbmUgTFBUU1RBVF9FUFBUSU1FT1VUICAgIDB4MDEKKworLyogTFBUIGRhdGEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTFBUREFUQV9TSElGVF9UREkgICAgIDAKKyNkZWZpbmUgTFBUREFUQV9TSElGVF9UTVMgICAgIDIKKyNkZWZpbmUgTFBUREFUQV9UREkgICAgICAgICAgICgxPDxMUFREQVRBX1NISUZUX1RESSkKKyNkZWZpbmUgTFBUREFUQV9UQ0sgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTFBUREFUQV9UTVMgICAgICAgICAgICgxPDxMUFREQVRBX1NISUZUX1RNUykKKyNkZWZpbmUgTFBUREFUQV9JTklUQklBUyAgICAgIDB4ODAKKworCisvKiBFUFAgbW9kZW0gY29uZmlnL3N0YXR1cyBiaXRzICovCisjZGVmaW5lIEVQUF9EQ0RCSVQgICAgICAgICAgICAweDgwCisjZGVmaW5lIEVQUF9QVFRCSVQgICAgICAgICAgICAweDA4CisjZGVmaW5lIEVQUF9SWEVCSVQgICAgICAgICAgICAweDAxCisjZGVmaW5lIEVQUF9SWEFFQklUICAgICAgICAgICAweDAyCisjZGVmaW5lIEVQUF9SWEhGVUxMICAgICAgICAgICAweDA0CisKKyNkZWZpbmUgRVBQX05USEYgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgRVBQX05UQUVGICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgRVBQX05URUYgICAgICAgICAgICAgIEVQUF9QVFRCSVQKKworI2RlZmluZSBFUFBfVFhfRklGT19FTkFCTEUgICAgMHgxMAorI2RlZmluZSBFUFBfUlhfRklGT19FTkFCTEUgICAgMHgwOAorI2RlZmluZSBFUFBfTU9ERU1fRU5BQkxFICAgICAgMHgyMAorI2RlZmluZSBFUFBfTEVEUyAgICAgICAgICAgICAgMHhDMAorI2RlZmluZSBFUFBfSVJRX0VOQUJMRSAgICAgICAgMHgxMAorCisvKiBYaWxpbnggNGsgSlRBRyBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWEM0S19JUkxFTkdUSCAgIDMKKyNkZWZpbmUgWEM0S19FWFRFU1QgICAgIDAKKyNkZWZpbmUgWEM0S19QUkVMT0FEICAgIDEKKyNkZWZpbmUgWEM0S19DT05GSUdVUkUgIDUKKyNkZWZpbmUgWEM0S19CWVBBU1MgICAgIDcKKworI2RlZmluZSBFUFBfQ09OVkVOVElPTkFMICAwCisjZGVmaW5lIEVQUF9GUEdBICAgICAgICAgIDEKKyNkZWZpbmUgRVBQX0ZQR0FFWFRTVEFUVVMgMgorCisjZGVmaW5lIFRYQlVGRkVSX1NJWkUgICAgICgoSERMQ0RSVl9NQVhGTEVOKjYvNSkrOCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLgorICovCisKK3N0cnVjdCBiYXljb21fc3RhdGUgeworCWludCBtYWdpYzsKKworICAgICAgICBzdHJ1Y3QgcGFyZGV2aWNlICpwZGV2OworCXVuc2lnbmVkIGludCB3b3JrX3J1bm5pbmc7CisJc3RydWN0IHdvcmtfc3RydWN0IHJ1bl93b3JrOworCXVuc2lnbmVkIGludCBtb2RlbTsKKwl1bnNpZ25lZCBpbnQgYml0cmF0ZTsKKwl1bnNpZ25lZCBjaGFyIHN0YXQ7CisKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgaW50Y2xrOworCQl1bnNpZ25lZCBpbnQgZmNsazsKKwkJdW5zaWduZWQgaW50IGJwczsKKwkJdW5zaWduZWQgaW50IGV4dG1vZGVtOworCQl1bnNpZ25lZCBpbnQgbG9vcGJhY2s7CisJfSBjZmc7CisKKyAgICAgICAgc3RydWN0IGhkbGNkcnZfY2hhbm5lbF9wYXJhbXMgY2hfcGFyYW1zOworCisgICAgICAgIHN0cnVjdCB7CisJCXVuc2lnbmVkIGludCBiaXRidWYsIGJpdHN0cmVhbSwgbnVtYml0cywgc3RhdGU7CisJCXVuc2lnbmVkIGNoYXIgKmJ1ZnB0cjsKKwkJaW50IGJ1ZmNudDsKKwkJdW5zaWduZWQgY2hhciBidWZbVFhCVUZGRVJfU0laRV07CisgICAgICAgIH0gaGRsY3J4OworCisgICAgICAgIHN0cnVjdCB7CisJCWludCBjYWxpYnJhdGU7CisgICAgICAgICAgICAgICAgaW50IHNsb3RjbnQ7CisJCWludCBmbGFnczsKKwkJZW51bSB7IHR4X2lkbGUgPSAwLCB0eF9rZXl1cCwgdHhfZGF0YSwgdHhfdGFpbCB9IHN0YXRlOworCQl1bnNpZ25lZCBjaGFyICpidWZwdHI7CisJCWludCBidWZjbnQ7CisJCXVuc2lnbmVkIGNoYXIgYnVmW1RYQlVGRkVSX1NJWkVdOworICAgICAgICB9IGhkbGN0eDsKKworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCBpbnQgcHR0X2tleWVkOworCXN0cnVjdCBza19idWZmICpza2I7ICAvKiBuZXh0IHRyYW5zbWl0IHBhY2tldCAgKi8KKworI2lmZGVmIEJBWUNPTV9ERUJVRworCXN0cnVjdCBkZWJ1Z192YWxzIHsKKwkJdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7CisJCXVuc2lnbmVkIGN1cl9pbnRjbnQ7CisJCXVuc2lnbmVkIGxhc3RfaW50Y250OworCQlpbnQgY3VyX3BsbGNvcnI7CisJCWludCBsYXN0X3BsbGNvcnI7CisJCXVuc2lnbmVkIGludCBtb2RfY3ljbGVzOworCQl1bnNpZ25lZCBpbnQgZGVtb2RfY3ljbGVzOworCX0gZGVidWdfdmFsczsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtJU1NfVkVSQk9TRQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBQQVJBTV9UWERFTEFZICAgMQorI2RlZmluZSBQQVJBTV9QRVJTSVNUICAgMgorI2RlZmluZSBQQVJBTV9TTE9UVElNRSAgMworI2RlZmluZSBQQVJBTV9UWFRBSUwgICAgNAorI2RlZmluZSBQQVJBTV9GVUxMRFVQICAgNQorI2RlZmluZSBQQVJBTV9IQVJEV0FSRSAgNgorI2RlZmluZSBQQVJBTV9SRVRVUk4gICAgMjU1CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIHRoZSBDUkMgcm91dGluZXMgYXJlIHN0b2xlbiBmcm9tIFdBTVBFUworICogYnkgRGlldGVyIERleWtlCisgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAwCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kX2NyY19jY2l0dCh1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisgCXVuc2lnbmVkIGludCBjcmMgPSAweGZmZmY7CisKKwlmb3IgKDtsZW4+MDtsZW4tLSkKKwkJY3JjID0gKGNyYyA+PiA4KSBeIGNyY19jY2l0dF90YWJsZVsoY3JjIF4gKmJ1ZmZlcisrKSAmIDB4ZmZdOworCWNyYyBePSAweGZmZmY7CisJKmJ1ZmZlcisrID0gY3JjOworCSpidWZmZXIrKyA9IGNyYyA+PiA4OworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfY3JjX2NjaXR0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNudCkKK3sKKwlyZXR1cm4gKGNyY19jY2l0dCgweGZmZmYsIGJ1ZiwgY250KSAmIDB4ZmZmZikgPT0gMHhmMGI4OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgaW50IGNhbGNfY3JjX2NjaXR0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNudCkKK3sKKwlyZXR1cm4gKGNyY19jY2l0dCgweGZmZmYsIGJ1ZiwgY250KSBeIDB4ZmZmZikgJiAweGZmZmY7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSB0ZW5tc190b19mbGFncyhiYyx0ZW5tcykgKCh0ZW5tcyAqIGJjLT5iaXRyYXRlKSAvIDgwMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiYXljb21faW50X2ZyZXEoc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMpCit7CisjaWZkZWYgQkFZQ09NX0RFQlVHCisJdW5zaWduZWQgbG9uZyBjdXJfamlmZmllcyA9IGppZmZpZXM7CisJLyoKKwkgKiBtZWFzdXJlIHRoZSBpbnRlcnJ1cHQgZnJlcXVlbmN5CisJICovCisJYmMtPmRlYnVnX3ZhbHMuY3VyX2ludGNudCsrOworCWlmICgoY3VyX2ppZmZpZXMgLSBiYy0+ZGVidWdfdmFscy5sYXN0X2ppZmZpZXMpID49IEhaKSB7CisJCWJjLT5kZWJ1Z192YWxzLmxhc3RfamlmZmllcyA9IGN1cl9qaWZmaWVzOworCQliYy0+ZGVidWdfdmFscy5sYXN0X2ludGNudCA9IGJjLT5kZWJ1Z192YWxzLmN1cl9pbnRjbnQ7CisJCWJjLT5kZWJ1Z192YWxzLmN1cl9pbnRjbnQgPSAwOworCQliYy0+ZGVidWdfdmFscy5sYXN0X3BsbGNvcnIgPSBiYy0+ZGVidWdfdmFscy5jdXJfcGxsY29ycjsKKwkJYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnIgPSAwOworCX0KKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqICAgIGVwcGNvbmZpZ19wYXRoIHNob3VsZCBiZSBzZXRhYmxlICB2aWEgL3Byb2Mvc3lzLgorICovCisKK3N0YXRpYyBjaGFyIGVwcGNvbmZpZ19wYXRoWzI1Nl0gPSAiL3Vzci9zYmluL2VwcGZwZ2EiOworCitzdGF0aWMgY2hhciAqZW52cFtdID0geyAiSE9NRT0vIiwgIlRFUk09bGludXgiLCAiUEFUSD0vdXNyL2JpbjovYmluIiwgTlVMTCB9OworCisvKiBlcHBjb25maWc6IGNhbGxlZCBkdXJpbmcgaWZjb25maWcgdXAgdG8gY29uZmlndXJlIHRoZSBtb2RlbSAqLworc3RhdGljIGludCBlcHBjb25maWcoc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMpCit7CisJY2hhciBtb2RlYXJnWzI1Nl07CisJY2hhciBwb3J0YXJnWzE2XTsKKyAgICAgICAgY2hhciAqYXJndltdID0geyBlcHBjb25maWdfcGF0aCwgIi1zIiwgIi1wIiwgcG9ydGFyZywgIi1tIiwgbW9kZWFyZywKKwkJCSBOVUxMIH07CisKKwkvKiBzZXQgdXAgYXJndW1lbnRzICovCisJc3ByaW50Zihtb2RlYXJnLCAiJXNjbGssJXNtb2RlbSxmY2xrPSVkLGJwcz0lZCxkaXZpZGVyPSVkJXMsZXh0c3RhdCIsCisJCWJjLT5jZmcuaW50Y2xrID8gImludCIgOiAiZXh0IiwKKwkJYmMtPmNmZy5leHRtb2RlbSA/ICJleHQiIDogImludCIsIGJjLT5jZmcuZmNsaywgYmMtPmNmZy5icHMsCisJCShiYy0+Y2ZnLmZjbGsgKyA4ICogYmMtPmNmZy5icHMpIC8gKDE2ICogYmMtPmNmZy5icHMpLAorCQliYy0+Y2ZnLmxvb3BiYWNrID8gIixsb29wYmFjayIgOiAiIik7CisJc3ByaW50Zihwb3J0YXJnLCAiJWxkIiwgYmMtPnBkZXYtPnBvcnQtPmJhc2UpOworCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgLXMgLXAgJXMgLW0gJXNcbiIsIGJjX2Rydm5hbWUsIGVwcGNvbmZpZ19wYXRoLCBwb3J0YXJnLCBtb2RlYXJnKTsKKworCXJldHVybiBjYWxsX3VzZXJtb2RlaGVscGVyKGVwcGNvbmZpZ19wYXRoLCBhcmd2LCBlbnZwLCAxKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBlcHBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGRvX2tpc3NfcGFyYW1zKHN0cnVjdCBiYXljb21fc3RhdGUgKmJjLAorCQkJCSAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisKKyNpZmRlZiBLSVNTX1ZFUkJPU0UKKyNkZWZpbmUgUEtQKGEsYikgcHJpbnRrKEtFUk5fSU5GTyAiYmF5Y29tbV9lcHA6IGNoYW5uZWwgcGFyYW1zOiAiIGEgIlxuIiwgYikKKyNlbHNlIC8qIEtJU1NfVkVSQk9TRSAqLwkgICAgICAKKyNkZWZpbmUgUEtQKGEsYikgCisjZW5kaWYgLyogS0lTU19WRVJCT1NFICovCSAgICAgIAorCisJaWYgKGxlbiA8IDIpCisJCXJldHVybjsKKwlzd2l0Y2goZGF0YVswXSkgeworCWNhc2UgUEFSQU1fVFhERUxBWToKKwkJYmMtPmNoX3BhcmFtcy50eF9kZWxheSA9IGRhdGFbMV07CisJCVBLUCgiVFggZGVsYXkgPSAldW1zIiwgMTAgKiBiYy0+Y2hfcGFyYW1zLnR4X2RlbGF5KTsKKwkJYnJlYWs7CisJY2FzZSBQQVJBTV9QRVJTSVNUOiAgIAorCQliYy0+Y2hfcGFyYW1zLnBwZXJzaXN0ID0gZGF0YVsxXTsKKwkJUEtQKCJwIHBlcnNpc3RlbmNlID0gJXUiLCBiYy0+Y2hfcGFyYW1zLnBwZXJzaXN0KTsKKwkJYnJlYWs7CisJY2FzZSBQQVJBTV9TTE9UVElNRTogIAorCQliYy0+Y2hfcGFyYW1zLnNsb3R0aW1lID0gZGF0YVsxXTsKKwkJUEtQKCJzbG90IHRpbWUgPSAldW1zIiwgYmMtPmNoX3BhcmFtcy5zbG90dGltZSk7CisJCWJyZWFrOworCWNhc2UgUEFSQU1fVFhUQUlMOiAgICAKKwkJYmMtPmNoX3BhcmFtcy50eF90YWlsID0gZGF0YVsxXTsKKwkJUEtQKCJUWCB0YWlsID0gJXVtcyIsIGJjLT5jaF9wYXJhbXMudHhfdGFpbCk7CisJCWJyZWFrOworCWNhc2UgUEFSQU1fRlVMTERVUDogICAKKwkJYmMtPmNoX3BhcmFtcy5mdWxsZHVwID0gISFkYXRhWzFdOworCQlQS1AoIiVzIGR1cGxleCIsIGJjLT5jaF9wYXJhbXMuZnVsbGR1cCA/ICJmdWxsIiA6ICJoYWxmIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKyN1bmRlZiBQS1AKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogaGlnaCBwZXJmb3JtYW5jZSBIRExDIGVuY29kZXIKKyAqIHllcywgaXQncyB1Z2x5LCBidXQgZ2VuZXJhdGVzIHByZXR0eSBnb29kIGNvZGUKKyAqLworCisjZGVmaW5lIEVOQ09ERUlURVJBKGopICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShub3RiaXRzdHJlYW0gJiAoMHgxZjAgPDwgaikpKSAgICBcCisgICAgICAgICAgICAgICAgZ290byBzdHVmZiMjajsgICAgICAgICAgICAgICAgIFwKKyAgZW5jb2RlZW5kIyNqOiAgICAJOyAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisjZGVmaW5lIEVOQ09ERUlURVJCKGopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3R1ZmYjI2o6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJpdHN0cmVhbSAmPSB+KDB4MTAwIDw8IGopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiaXRidWYgPSAoYml0YnVmICYgKCgoMiA8PCBqKSA8PCBudW1iaXQpIC0gMSkpIHwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGJpdGJ1ZiAmIH4oKCgyIDw8IGopIDw8IG51bWJpdCkgLSAxKSkgPDwgMSk7ICBcCisgICAgICAgIG51bWJpdCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBub3RiaXRzdHJlYW0gPSB+Yml0c3RyZWFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ290byBlbmNvZGVlbmQjI2o7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisKK3N0YXRpYyB2b2lkIGVuY29kZV9oZGxjKHN0cnVjdCBiYXljb21fc3RhdGUgKmJjKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqd3AsICpicDsKKwlpbnQgcGt0X2xlbjsKKyAgICAgICAgdW5zaWduZWQgYml0c3RyZWFtLCBub3RiaXRzdHJlYW0sIGJpdGJ1ZiwgbnVtYml0LCBjcmM7CisJdW5zaWduZWQgY2hhciBjcmNhcnJbMl07CisJCisJaWYgKGJjLT5oZGxjdHguYnVmY250ID4gMCkKKwkJcmV0dXJuOworCXNrYiA9IGJjLT5za2I7CisJaWYgKCFza2IpCisJCXJldHVybjsKKwliYy0+c2tiID0gTlVMTDsKKwlwa3RfbGVuID0gc2tiLT5sZW4tMTsgLyogc3RyaXAgS0lTUyBieXRlICovCisJd3AgPSBiYy0+aGRsY3R4LmJ1ZjsKKwlicCA9IHNrYi0+ZGF0YSsxOworCWNyYyA9IGNhbGNfY3JjX2NjaXR0KGJwLCBwa3RfbGVuKTsKKwljcmNhcnJbMF0gPSBjcmM7CisJY3JjYXJyWzFdID0gY3JjID4+IDg7CisJKndwKysgPSAweDdlOworCWJpdHN0cmVhbSA9IGJpdGJ1ZiA9IG51bWJpdCA9IDA7CisJd2hpbGUgKHBrdF9sZW4gPiAtMikgeworCQliaXRzdHJlYW0gPj49IDg7CisJCWJpdHN0cmVhbSB8PSAoKHVuc2lnbmVkIGludCkqYnApIDw8IDg7CisJCWJpdGJ1ZiB8PSAoKHVuc2lnbmVkIGludCkqYnApIDw8IG51bWJpdDsKKwkJbm90Yml0c3RyZWFtID0gfmJpdHN0cmVhbTsKKwkJYnArKzsKKwkJcGt0X2xlbi0tOworCQlpZiAoIXBrdF9sZW4pCisJCQlicCA9IGNyY2FycjsKKwkJRU5DT0RFSVRFUkEoMCk7CisJCUVOQ09ERUlURVJBKDEpOworCQlFTkNPREVJVEVSQSgyKTsKKwkJRU5DT0RFSVRFUkEoMyk7CisJCUVOQ09ERUlURVJBKDQpOworCQlFTkNPREVJVEVSQSg1KTsKKwkJRU5DT0RFSVRFUkEoNik7CisJCUVOQ09ERUlURVJBKDcpOworCQlnb3RvIGVuZGl0ZXI7CisJCUVOQ09ERUlURVJCKDApOworCQlFTkNPREVJVEVSQigxKTsKKwkJRU5DT0RFSVRFUkIoMik7CisJCUVOQ09ERUlURVJCKDMpOworCQlFTkNPREVJVEVSQig0KTsKKwkJRU5DT0RFSVRFUkIoNSk7CisJCUVOQ09ERUlURVJCKDYpOworCQlFTkNPREVJVEVSQig3KTsKKwllbmRpdGVyOgorCQludW1iaXQgKz0gODsKKwkJd2hpbGUgKG51bWJpdCA+PSA4KSB7CisJCQkqd3ArKyA9IGJpdGJ1ZjsKKwkJCWJpdGJ1ZiA+Pj0gODsKKwkJCW51bWJpdCAtPSA4OworCQl9CisJfQorCWJpdGJ1ZiB8PSAweDdlN2UgPDwgbnVtYml0OworCW51bWJpdCArPSAxNjsKKwl3aGlsZSAobnVtYml0ID49IDgpIHsKKwkJKndwKysgPSBiaXRidWY7CisJCWJpdGJ1ZiA+Pj0gODsKKwkJbnVtYml0IC09IDg7CisJfQorCWJjLT5oZGxjdHguYnVmcHRyID0gYmMtPmhkbGN0eC5idWY7CisJYmMtPmhkbGN0eC5idWZjbnQgPSB3cCAtIGJjLT5oZGxjdHguYnVmOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwliYy0+c3RhdHMudHhfcGFja2V0cysrOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByYW5kb21fc2VlZDsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCByYW5kb21fbnVtKHZvaWQpCit7CisJcmFuZG9tX3NlZWQgPSAyODYyOSAqIHJhbmRvbV9zZWVkICsgMTU3OworCXJldHVybiByYW5kb21fc2VlZDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHRyYW5zbWl0KHN0cnVjdCBiYXljb21fc3RhdGUgKmJjLCBpbnQgY250LCB1bnNpZ25lZCBjaGFyIHN0YXQpCit7CisJc3RydWN0IHBhcnBvcnQgKnBwID0gYmMtPnBkZXYtPnBvcnQ7CisJdW5zaWduZWQgY2hhciB0bXBbMTI4XTsKKwlpbnQgaSwgajsKKworCWlmIChiYy0+aGRsY3R4LnN0YXRlID09IHR4X3RhaWwgJiYgIShzdGF0ICYgRVBQX1BUVEJJVCkpCisJCWJjLT5oZGxjdHguc3RhdGUgPSB0eF9pZGxlOworCWlmIChiYy0+aGRsY3R4LnN0YXRlID09IHR4X2lkbGUgJiYgYmMtPmhkbGN0eC5jYWxpYnJhdGUgPD0gMCkgeworCQlpZiAoYmMtPmhkbGN0eC5idWZjbnQgPD0gMCkKKwkJCWVuY29kZV9oZGxjKGJjKTsKKwkJaWYgKGJjLT5oZGxjdHguYnVmY250IDw9IDApCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFiYy0+Y2hfcGFyYW1zLmZ1bGxkdXApIHsKKwkJCWlmICghKHN0YXQgJiBFUFBfRENEQklUKSkgeworCQkJCWJjLT5oZGxjdHguc2xvdGNudCA9IGJjLT5jaF9wYXJhbXMuc2xvdHRpbWU7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoKC0tYmMtPmhkbGN0eC5zbG90Y250KSA+IDApCisJCQkJcmV0dXJuIDA7CisJCQliYy0+aGRsY3R4LnNsb3RjbnQgPSBiYy0+Y2hfcGFyYW1zLnNsb3R0aW1lOworCQkJaWYgKChyYW5kb21fbnVtKCkgJSAyNTYpID4gYmMtPmNoX3BhcmFtcy5wcGVyc2lzdCkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoYmMtPmhkbGN0eC5zdGF0ZSA9PSB0eF9pZGxlICYmIGJjLT5oZGxjdHguYnVmY250ID4gMCkgeworCQliYy0+aGRsY3R4LnN0YXRlID0gdHhfa2V5dXA7CisJCWJjLT5oZGxjdHguZmxhZ3MgPSB0ZW5tc190b19mbGFncyhiYywgYmMtPmNoX3BhcmFtcy50eF9kZWxheSk7CisJCWJjLT5wdHRfa2V5ZWQrKzsKKwl9CisJd2hpbGUgKGNudCA+IDApIHsKKwkJc3dpdGNoIChiYy0+aGRsY3R4LnN0YXRlKSB7CisJCWNhc2UgdHhfa2V5dXA6CisJCQlpID0gbWluX3QoaW50LCBjbnQsIGJjLT5oZGxjdHguZmxhZ3MpOworCQkJY250IC09IGk7CisJCQliYy0+aGRsY3R4LmZsYWdzIC09IGk7CisJCQlpZiAoYmMtPmhkbGN0eC5mbGFncyA8PSAwKQorCQkJCWJjLT5oZGxjdHguc3RhdGUgPSB0eF9kYXRhOworCQkJbWVtc2V0KHRtcCwgMHg3ZSwgc2l6ZW9mKHRtcCkpOworCQkJd2hpbGUgKGkgPiAwKSB7CisJCQkJaiA9IChpID4gc2l6ZW9mKHRtcCkpID8gc2l6ZW9mKHRtcCkgOiBpOworCQkJCWlmIChqICE9IHBwLT5vcHMtPmVwcF93cml0ZV9kYXRhKHBwLCB0bXAsIGosIDApKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJaSAtPSBqOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSB0eF9kYXRhOgorCQkJaWYgKGJjLT5oZGxjdHguYnVmY250IDw9IDApIHsKKwkJCQllbmNvZGVfaGRsYyhiYyk7CisJCQkJaWYgKGJjLT5oZGxjdHguYnVmY250IDw9IDApIHsKKwkJCQkJYmMtPmhkbGN0eC5zdGF0ZSA9IHR4X3RhaWw7CisJCQkJCWJjLT5oZGxjdHguZmxhZ3MgPSB0ZW5tc190b19mbGFncyhiYywgYmMtPmNoX3BhcmFtcy50eF90YWlsKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaSA9IG1pbl90KGludCwgY250LCBiYy0+aGRsY3R4LmJ1ZmNudCk7CisJCQliYy0+aGRsY3R4LmJ1ZmNudCAtPSBpOworCQkJY250IC09IGk7CisJCQlpZiAoaSAhPSBwcC0+b3BzLT5lcHBfd3JpdGVfZGF0YShwcCwgYmMtPmhkbGN0eC5idWZwdHIsIGksIDApKQorCQkJCQlyZXR1cm4gLTE7CisJCQliYy0+aGRsY3R4LmJ1ZnB0ciArPSBpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSB0eF90YWlsOgorCQkJZW5jb2RlX2hkbGMoYmMpOworCQkJaWYgKGJjLT5oZGxjdHguYnVmY250ID4gMCkgeworCQkJCWJjLT5oZGxjdHguc3RhdGUgPSB0eF9kYXRhOworCQkJCWJyZWFrOworCQkJfQorCQkJaSA9IG1pbl90KGludCwgY250LCBiYy0+aGRsY3R4LmZsYWdzKTsKKwkJCWlmIChpKSB7CisJCQkJY250IC09IGk7CisJCQkJYmMtPmhkbGN0eC5mbGFncyAtPSBpOworCQkJCW1lbXNldCh0bXAsIDB4N2UsIHNpemVvZih0bXApKTsKKwkJCQl3aGlsZSAoaSA+IDApIHsKKwkJCQkJaiA9IChpID4gc2l6ZW9mKHRtcCkpID8gc2l6ZW9mKHRtcCkgOiBpOworCQkJCQlpZiAoaiAhPSBwcC0+b3BzLT5lcHBfd3JpdGVfZGF0YShwcCwgdG1wLCBqLCAwKSkKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJaSAtPSBqOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OiAgLyogZmFsbCB0aHJvdWdoICovCisJCQlpZiAoYmMtPmhkbGN0eC5jYWxpYnJhdGUgPD0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCWkgPSBtaW5fdChpbnQsIGNudCwgYmMtPmhkbGN0eC5jYWxpYnJhdGUpOworCQkJY250IC09IGk7CisJCQliYy0+aGRsY3R4LmNhbGlicmF0ZSAtPSBpOworCQkJbWVtc2V0KHRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCQkJd2hpbGUgKGkgPiAwKSB7CisJCQkJaiA9IChpID4gc2l6ZW9mKHRtcCkpID8gc2l6ZW9mKHRtcCkgOiBpOworCQkJCWlmIChqICE9IHBwLT5vcHMtPmVwcF93cml0ZV9kYXRhKHBwLCB0bXAsIGosIDApKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJaSAtPSBqOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgZG9fcnhwYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpjcDsKKwl1bnNpZ25lZCBwa3RsZW47CisKKwlpZiAoYmMtPmhkbGNyeC5idWZjbnQgPCA0KSAKKwkJcmV0dXJuOworCWlmICghY2hlY2tfY3JjX2NjaXR0KGJjLT5oZGxjcnguYnVmLCBiYy0+aGRsY3J4LmJ1ZmNudCkpIAorCQlyZXR1cm47CisJcGt0bGVuID0gYmMtPmhkbGNyeC5idWZjbnQtMisxOyAvKiBLSVNTIGtsdWRnZSAqLworCWlmICghKHNrYiA9IGRldl9hbGxvY19za2IocGt0bGVuKSkpIHsKKwkJcHJpbnRrKCIlczogbWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldFxuIiwgZGV2LT5uYW1lKTsKKwkJYmMtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKwlza2ItPmRldiA9IGRldjsKKwljcCA9IHNrYl9wdXQoc2tiLCBwa3RsZW4pOworCSpjcCsrID0gMDsgLyogS0lTUyBrbHVkZ2UgKi8KKwltZW1jcHkoY3AsIGJjLT5oZGxjcnguYnVmLCBwa3RsZW4gLSAxKTsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVgyNSk7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCW5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwliYy0+c3RhdHMucnhfcGFja2V0cysrOworfQorCisjZGVmaW5lIERFQ09ERUlURVJBKGopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKG5vdGJpdHN0cmVhbSAmICgweDBmYyA8PCBqKSkpICAgICAgICAgICAgICAvKiBmbGFnIG9yIGFib3J0ICovICBcCisgICAgICAgICAgICAgICAgZ290byBmbGdhYnJ0IyNqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoYml0c3RyZWFtICYgKDB4MWY4IDw8IGopKSA9PSAoMHhmOCA8PCBqKSkgICAvKiBzdHVmZmVkIGJpdCAqLyAgICBcCisgICAgICAgICAgICAgICAgZ290byBzdHVmZiMjajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVuZGl0ZXIjI2o6ICAgICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworI2RlZmluZSBERUNPREVJVEVSQihqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmbGdhYnJ0IyNqOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShub3RiaXRzdHJlYW0gJiAoMHgxZmMgPDwgaikpKSB7ICAgICAgICAgICAgICAvKiBhYm9ydCByZWNlaXZlZCAqLyAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0YXRlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gZW5kaXRlciMjajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKGJpdHN0cmVhbSAmICgweDFmZSA8PCBqKSkgIT0gKDB4MGZjIDw8IGopKSAgIC8qIGZsYWcgcmVjZWl2ZWQgKi8gICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gZW5kaXRlciMjajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRvX3J4cGFja2V0KGRldik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiYy0+aGRsY3J4LmJ1ZmNudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiYy0+aGRsY3J4LmJ1ZnB0ciA9IGJjLT5oZGxjcnguYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0ZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBudW1iaXRzID0gNy1qOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIGVuZGl0ZXIjI2o7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHVmZiMjajogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBudW1iaXRzLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiaXRidWYgPSAoYml0YnVmICYgKCh+MHhmZikgPDwgaikpIHwgKChiaXRidWYgJiB+KCh+MHhmZikgPDwgaikpIDw8IDEpOyAgICAgICAgXAorICAgICAgICBnb3RvIGVuZGl0ZXIjI2o7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKyAgICAgICAgCitzdGF0aWMgaW50IHJlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNudCkKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBhcnBvcnQgKnBwID0gYmMtPnBkZXYtPnBvcnQ7CisgICAgICAgIHVuc2lnbmVkIGludCBiaXRidWYsIG5vdGJpdHN0cmVhbSwgYml0c3RyZWFtLCBudW1iaXRzLCBzdGF0ZTsKKwl1bnNpZ25lZCBjaGFyIHRtcFsxMjhdOworICAgICAgICB1bnNpZ25lZCBjaGFyICpjcDsKKwlpbnQgY250MiwgcmV0ID0gMDsKKyAgICAgICAgCisgICAgICAgIG51bWJpdHMgPSBiYy0+aGRsY3J4Lm51bWJpdHM7CisJc3RhdGUgPSBiYy0+aGRsY3J4LnN0YXRlOworCWJpdHN0cmVhbSA9IGJjLT5oZGxjcnguYml0c3RyZWFtOworCWJpdGJ1ZiA9IGJjLT5oZGxjcnguYml0YnVmOworCXdoaWxlIChjbnQgPiAwKSB7CisJCWNudDIgPSAoY250ID4gc2l6ZW9mKHRtcCkpID8gc2l6ZW9mKHRtcCkgOiBjbnQ7CisJCWNudCAtPSBjbnQyOworCQlpZiAoY250MiAhPSBwcC0+b3BzLT5lcHBfcmVhZF9kYXRhKHBwLCB0bXAsIGNudDIsIDApKSB7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWNwID0gdG1wOworCQlmb3IgKDsgY250MiA+IDA7IGNudDItLSwgY3ArKykgeworCQkJYml0c3RyZWFtID4+PSA4OworCQkJYml0c3RyZWFtIHw9ICgqY3ApIDw8IDg7CisJCQliaXRidWYgPj49IDg7CisJCQliaXRidWYgfD0gKCpjcCkgPDwgODsKKwkJCW51bWJpdHMgKz0gODsKKwkJCW5vdGJpdHN0cmVhbSA9IH5iaXRzdHJlYW07CisJCQlERUNPREVJVEVSQSgwKTsKKwkJCURFQ09ERUlURVJBKDEpOworCQkJREVDT0RFSVRFUkEoMik7CisJCQlERUNPREVJVEVSQSgzKTsKKwkJCURFQ09ERUlURVJBKDQpOworCQkJREVDT0RFSVRFUkEoNSk7CisJCQlERUNPREVJVEVSQSg2KTsKKwkJCURFQ09ERUlURVJBKDcpOworCQkJZ290byBlbmRkZWM7CisJCQlERUNPREVJVEVSQigwKTsKKwkJCURFQ09ERUlURVJCKDEpOworCQkJREVDT0RFSVRFUkIoMik7CisJCQlERUNPREVJVEVSQigzKTsKKwkJCURFQ09ERUlURVJCKDQpOworCQkJREVDT0RFSVRFUkIoNSk7CisJCQlERUNPREVJVEVSQig2KTsKKwkJCURFQ09ERUlURVJCKDcpOworCQllbmRkZWM6CisJCQl3aGlsZSAoc3RhdGUgJiYgbnVtYml0cyA+PSA4KSB7CisJCQkJaWYgKGJjLT5oZGxjcnguYnVmY250ID49IFRYQlVGRkVSX1NJWkUpIHsKKwkJCQkJc3RhdGUgPSAwOworCQkJCX0gZWxzZSB7CisJCQkJCSooYmMtPmhkbGNyeC5idWZwdHIpKysgPSBiaXRidWYgPj4gKDE2LW51bWJpdHMpOworCQkJCQliYy0+aGRsY3J4LmJ1ZmNudCsrOworCQkJCQludW1iaXRzIC09IDg7CisJCQkJfQorCQkJfQorCQl9CisJfQorICAgICAgICBiYy0+aGRsY3J4Lm51bWJpdHMgPSBudW1iaXRzOworCWJjLT5oZGxjcnguc3RhdGUgPSBzdGF0ZTsKKwliYy0+aGRsY3J4LmJpdHN0cmVhbSA9IGJpdHN0cmVhbTsKKwliYy0+aGRsY3J4LmJpdGJ1ZiA9IGJpdGJ1ZjsKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIF9faTM4Nl9fCisjaW5jbHVkZSA8YXNtL21zci5oPgorI2RlZmluZSBHRVRUSUNLKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChjcHVfaGFzX3RzYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXJkdHNjbCh4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKyNlbHNlIC8qIF9faTM4Nl9fICovCisjZGVmaW5lIEdFVFRJQ0soeCkKKyNlbmRpZiAvKiBfX2kzODZfXyAqLworCitzdGF0aWMgdm9pZCBlcHBfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYzsKKwlzdHJ1Y3QgcGFycG9ydCAqcHA7CisJdW5zaWduZWQgY2hhciBzdGF0OworCXVuc2lnbmVkIGNoYXIgdG1wWzJdOworCXVuc2lnbmVkIGludCB0aW1lMSA9IDAsIHRpbWUyID0gMCwgdGltZTMgPSAwOworCWludCBjbnQsIGNudDI7CisJCisJYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCWlmICghYmMtPndvcmtfcnVubmluZykKKwkJcmV0dXJuOworCWJheWNvbV9pbnRfZnJlcShiYyk7CisJcHAgPSBiYy0+cGRldi0+cG9ydDsKKwkvKiB1cGRhdGUgc3RhdHVzICovCisJaWYgKHBwLT5vcHMtPmVwcF9yZWFkX2FkZHIocHAsICZzdGF0LCAxLCAwKSAhPSAxKQorCQlnb3RvIGVwcHRpbWVvdXQ7CisJYmMtPnN0YXQgPSBzdGF0OworCWJjLT5kZWJ1Z192YWxzLmxhc3RfcGxsY29yciA9IHN0YXQ7CisJR0VUVElDSyh0aW1lMSk7CisJaWYgKGJjLT5tb2RlbSA9PSBFUFBfRlBHQUVYVFNUQVRVUykgeworCQkvKiBnZXQgaW5wdXQgY291bnQgKi8KKwkJdG1wWzBdID0gRVBQX1RYX0ZJRk9fRU5BQkxFfEVQUF9SWF9GSUZPX0VOQUJMRXxFUFBfTU9ERU1fRU5BQkxFfDE7CisJCWlmIChwcC0+b3BzLT5lcHBfd3JpdGVfYWRkcihwcCwgdG1wLCAxLCAwKSAhPSAxKQorCQkJZ290byBlcHB0aW1lb3V0OworCQlpZiAocHAtPm9wcy0+ZXBwX3JlYWRfYWRkcihwcCwgdG1wLCAyLCAwKSAhPSAyKQorCQkJZ290byBlcHB0aW1lb3V0OworCQljbnQgPSB0bXBbMF0gfCAodG1wWzFdIDw8IDgpOworCQljbnQgJj0gMHg3ZmZmOworCQkvKiBnZXQgb3V0cHV0IGNvdW50ICovCisJCXRtcFswXSA9IEVQUF9UWF9GSUZPX0VOQUJMRXxFUFBfUlhfRklGT19FTkFCTEV8RVBQX01PREVNX0VOQUJMRXwyOworCQlpZiAocHAtPm9wcy0+ZXBwX3dyaXRlX2FkZHIocHAsIHRtcCwgMSwgMCkgIT0gMSkKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJaWYgKHBwLT5vcHMtPmVwcF9yZWFkX2FkZHIocHAsIHRtcCwgMiwgMCkgIT0gMikKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJY250MiA9IHRtcFswXSB8ICh0bXBbMV0gPDwgOCk7CisJCWNudDIgPSAxNjM4NCAtIChjbnQyICYgMHg3ZmZmKTsKKwkJLyogcmV0dXJuIHRvIG5vcm1hbCAqLworCQl0bXBbMF0gPSBFUFBfVFhfRklGT19FTkFCTEV8RVBQX1JYX0ZJRk9fRU5BQkxFfEVQUF9NT0RFTV9FTkFCTEU7CisJCWlmIChwcC0+b3BzLT5lcHBfd3JpdGVfYWRkcihwcCwgdG1wLCAxLCAwKSAhPSAxKQorCQkJZ290byBlcHB0aW1lb3V0OworCQlpZiAodHJhbnNtaXQoYmMsIGNudDIsIHN0YXQpKQorCQkJZ290byBlcHB0aW1lb3V0OworCQlHRVRUSUNLKHRpbWUyKTsKKwkJaWYgKHJlY2VpdmUoZGV2LCBjbnQpKQorCQkJZ290byBlcHB0aW1lb3V0OworCQlpZiAocHAtPm9wcy0+ZXBwX3JlYWRfYWRkcihwcCwgJnN0YXQsIDEsIDApICE9IDEpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCWJjLT5zdGF0ID0gc3RhdDsKKwl9IGVsc2UgeworCQkvKiB0cnkgdG8gdHggKi8KKwkJc3dpdGNoIChzdGF0ICYgKEVQUF9OVEFFRnxFUFBfTlRIRikpIHsKKwkJY2FzZSBFUFBfTlRIRjoKKwkJCWNudCA9IDIwNDggLSAyNTY7CisJCQlicmVhazsKKwkJCisJCWNhc2UgRVBQX05UQUVGOgorCQkJY250ID0gMjA0OCAtIDE3OTM7CisJCQlicmVhazsKKwkJCisJCWNhc2UgMDoKKwkJCWNudCA9IDA7CisJCQlicmVhazsKKwkJCisJCWRlZmF1bHQ6CisJCQljbnQgPSAyMDQ4IC0gMTAyNTsKKwkJCWJyZWFrOworCQl9CisJCWlmICh0cmFuc21pdChiYywgY250LCBzdGF0KSkKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJR0VUVElDSyh0aW1lMik7CisJCS8qIGRvIHJlY2VpdmVyICovCisJCXdoaWxlICgoc3RhdCAmIChFUFBfTlJBRUZ8RVBQX05SSEYpKSAhPSBFUFBfTlJIRikgeworCQkJc3dpdGNoIChzdGF0ICYgKEVQUF9OUkFFRnxFUFBfTlJIRikpIHsKKwkJCWNhc2UgRVBQX05SQUVGOgorCQkJCWNudCA9IDEwMjU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMDoKKwkJCQljbnQgPSAxNzkzOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWNudCA9IDI1NjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChyZWNlaXZlKGRldiwgY250KSkKKwkJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCQlpZiAocHAtPm9wcy0+ZXBwX3JlYWRfYWRkcihwcCwgJnN0YXQsIDEsIDApICE9IDEpCisJCQkJZ290byBlcHB0aW1lb3V0OworCQl9CisJCWNudCA9IDA7CisJCWlmIChiYy0+Yml0cmF0ZSA8IDUwMDAwKQorCQkJY250ID0gMjU2OworCQllbHNlIGlmIChiYy0+Yml0cmF0ZSA8IDEwMDAwMCkKKwkJCWNudCA9IDEyODsKKwkJd2hpbGUgKGNudCA+IDAgJiYgc3RhdCAmIEVQUF9OUkVGKSB7CisJCQlpZiAocmVjZWl2ZShkZXYsIDEpKQorCQkJCWdvdG8gZXBwdGltZW91dDsKKwkJCWNudC0tOworCQkJaWYgKHBwLT5vcHMtPmVwcF9yZWFkX2FkZHIocHAsICZzdGF0LCAxLCAwKSAhPSAxKQorCQkJCWdvdG8gZXBwdGltZW91dDsKKwkJfQorCX0KKwlHRVRUSUNLKHRpbWUzKTsKKyNpZmRlZiBCQVlDT01fREVCVUcKKwliYy0+ZGVidWdfdmFscy5tb2RfY3ljbGVzID0gdGltZTIgLSB0aW1lMTsKKwliYy0+ZGVidWdfdmFscy5kZW1vZF9jeWNsZXMgPSB0aW1lMyAtIHRpbWUyOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYmMtPnJ1bl93b3JrLCAxKTsKKwlpZiAoIWJjLT5za2IpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm47CisgZXBwdGltZW91dDoKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBFUFAgdGltZW91dCFcbiIsIGJjX2Rydm5hbWUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09IG5ldHdvcmsgZHJpdmVyIGludGVyZmFjZSA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworc3RhdGljIGludCBiYXljb21fc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoc2tiLT5kYXRhWzBdICE9IDApIHsKKwkJZG9fa2lzc19wYXJhbXMoYmMsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKwlpZiAoYmMtPnNrYikKKwkJcmV0dXJuIC0xOworCS8qIHN0cmlwIEtJU1MgYnl0ZSAqLworCWlmIChza2ItPmxlbiA+PSBIRExDRFJWX01BWEZMRU4rMSB8fCBza2ItPmxlbiA8IDMpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWJjLT5za2IgPSBza2I7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJheWNvbV9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKWFkZHI7CisKKwkvKiBhZGRyIGlzIGFuIEFYLjI1IHNoaWZ0ZWQgQVNDSUkgbWFjIGFkZHJlc3MgKi8KKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOyAKKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpiYXljb21fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogCisJICogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuICBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUKKwkgKiBjYXJkIG9wZW4gb3IgY2xvc2VkLiAKKwkgKi8KKwlyZXR1cm4gJmJjLT5zdGF0czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGVwcF93YWtldXAodm9pZCAqaGFuZGxlKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopaGFuZGxlOworICAgICAgICBzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgImJheWNvbV9lcHA6ICVzOiB3aHkgYW0gSSBiZWluZyB3b2tlbiB1cD9cbiIsIGRldi0+bmFtZSk7CisgICAgICAgIGlmICghcGFycG9ydF9jbGFpbShiYy0+cGRldikpCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgImJheWNvbV9lcHA6ICVzOiBJJ20gYnJva2VuLlxuIiwgZGV2LT5uYW1lKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICogc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCisKK3N0YXRpYyBpbnQgZXBwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHN0cnVjdCBwYXJwb3J0ICpwcCA9IHBhcnBvcnRfZmluZF9iYXNlKGRldi0+YmFzZV9hZGRyKTsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwl1bnNpZ25lZCBjaGFyIHRtcFsxMjhdOworCXVuc2lnbmVkIGNoYXIgc3RhdDsKKwl1bnNpZ25lZCBsb25nIHRzdGFydDsKKwkKKyAgICAgICAgaWYgKCFwcCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IHBhcnBvcnQgYXQgMHglbHggdW5rbm93blxuIiwgYmNfZHJ2bmFtZSwgZGV2LT5iYXNlX2FkZHIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87CisgICAgICAgIH0KKyNpZiAwCisgICAgICAgIGlmIChwcC0+aXJxIDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IHBhcnBvcnQgYXQgMHglbHggaGFzIG5vIGlycVxuIiwgYmNfZHJ2bmFtZSwgcHAtPmJhc2UpOworCQlwYXJwb3J0X3B1dF9wb3J0KHBwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOworICAgICAgICB9CisjZW5kaWYKKwlpZiAoKH5wcC0+bW9kZXMpICYgKFBBUlBPUlRfTU9ERV9UUklTVEFURSB8IFBBUlBPUlRfTU9ERV9QQ1NQUCB8IFBBUlBPUlRfTU9ERV9TQUZFSU5JTlQpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogcGFycG9ydCBhdCAweCVseCBjYW5ub3QgYmUgdXNlZFxuIiwKKwkJICAgICAgIGJjX2Rydm5hbWUsIHBwLT5iYXNlKTsKKwkJcGFycG9ydF9wdXRfcG9ydChwcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87CisJfQorCW1lbXNldCgmYmMtPm1vZGVtLCAwLCBzaXplb2YoYmMtPm1vZGVtKSk7CisgICAgICAgIGJjLT5wZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocHAsIGRldi0+bmFtZSwgTlVMTCwgZXBwX3dha2V1cCwgCisJCQkJCWVwcF9pbnRlcnJ1cHQsIFBBUlBPUlRfREVWX0VYQ0wsIGRldik7CisJcGFycG9ydF9wdXRfcG9ydChwcCk7CisgICAgICAgIGlmICghYmMtPnBkZXYpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgcmVnaXN0ZXIgcGFycG9ydCBhdCAweCVseFxuIiwgYmNfZHJ2bmFtZSwgcHAtPmJhc2UpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcnBvcnRfY2xhaW0oYmMtPnBkZXYpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogcGFycG9ydCBhdCAweCVseCBidXN5XG4iLCBiY19kcnZuYW1lLCBwcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShiYy0+cGRldik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorICAgICAgICBkZXYtPmlycSA9IC8qcHAtPmlycSovIDA7CisJSU5JVF9XT1JLKCZiYy0+cnVuX3dvcmssICh2b2lkICopKHZvaWQgKillcHBfYmgsIGRldik7CisJYmMtPndvcmtfcnVubmluZyA9IDE7CisJYmMtPm1vZGVtID0gRVBQX0NPTlZFTlRJT05BTDsKKwlpZiAoZXBwY29uZmlnKGJjKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIEZQR0EgZGV0ZWN0ZWQsIGFzc3VtaW5nIGNvbnZlbnRpb25hbCBFUFAgbW9kZW1cbiIsIGJjX2Rydm5hbWUpOworCWVsc2UKKwkJYmMtPm1vZGVtID0gLypFUFBfRlBHQSovIEVQUF9GUEdBRVhUU1RBVFVTOworCXBhcnBvcnRfd3JpdGVfY29udHJvbChwcCwgTFBUQ1RSTF9QUk9HUkFNKTsgLyogcHJlcGFyZSBFUFAgbW9kZTsgd2UgYXJlbid0IHVzaW5nIGludGVycnVwdHMgKi8KKwkvKiByZXNldCB0aGUgbW9kZW0gKi8KKwl0bXBbMF0gPSAwOworCXRtcFsxXSA9IEVQUF9UWF9GSUZPX0VOQUJMRXxFUFBfUlhfRklGT19FTkFCTEV8RVBQX01PREVNX0VOQUJMRTsKKwlpZiAocHAtPm9wcy0+ZXBwX3dyaXRlX2FkZHIocHAsIHRtcCwgMiwgMCkgIT0gMikKKwkJZ290byBlcHB0aW1lb3V0OworCS8qIGF1dG9wcm9iZSBiYXVkIHJhdGUgKi8KKwl0c3RhcnQgPSBqaWZmaWVzOworCWkgPSAwOworCXdoaWxlICgoc2lnbmVkKShqaWZmaWVzLXRzdGFydC1IWi8zKSA8IDApIHsKKwkJaWYgKHBwLT5vcHMtPmVwcF9yZWFkX2FkZHIocHAsICZzdGF0LCAxLCAwKSAhPSAxKQorCQkJZ290byBlcHB0aW1lb3V0OworCQlpZiAoKHN0YXQgJiAoRVBQX05SQUVGfEVQUF9OUkhGKSkgPT0gRVBQX05SSEYpIHsKKwkJCXNjaGVkdWxlKCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocHAtPm9wcy0+ZXBwX3JlYWRfZGF0YShwcCwgdG1wLCAxMjgsIDApICE9IDEyOCkKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJaWYgKHBwLT5vcHMtPmVwcF9yZWFkX2RhdGEocHAsIHRtcCwgMTI4LCAwKSAhPSAxMjgpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCWkgKz0gMjU2OworCX0KKwlmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKwkJaWYgKHBwLT5vcHMtPmVwcF9yZWFkX2FkZHIocHAsICZzdGF0LCAxLCAwKSAhPSAxKQorCQkJZ290byBlcHB0aW1lb3V0OworCQlpZiAoIShzdGF0ICYgRVBQX05SRUYpKQorCQkJYnJlYWs7CisJCWlmIChwcC0+b3BzLT5lcHBfcmVhZF9kYXRhKHBwLCB0bXAsIDEsIDApICE9IDEpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCWkrKzsKKwl9CisJdHN0YXJ0ID0gamlmZmllcyAtIHRzdGFydDsKKwliYy0+Yml0cmF0ZSA9IGkgKiAoOCAqIEhaKSAvIHRzdGFydDsKKwlqID0gMTsKKwlpID0gYmMtPmJpdHJhdGUgPj4gMzsKKwl3aGlsZSAoaiA8IDcgJiYgaSA+IDE1MCkgeworCQlqKys7CisJCWkgPj49IDE7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBhdXRvcHJvYmVkIGJpdHJhdGU6ICVkICBpbnQgZGl2aWRlcjogJWQgIGludCByYXRlOiAlZFxuIiwgCisJICAgICAgIGJjX2Rydm5hbWUsIGJjLT5iaXRyYXRlLCBqLCBiYy0+Yml0cmF0ZSA+PiAoaisyKSk7CisJdG1wWzBdID0gRVBQX1RYX0ZJRk9fRU5BQkxFfEVQUF9SWF9GSUZPX0VOQUJMRXxFUFBfTU9ERU1fRU5BQkxFLyp8aiovOworCWlmIChwcC0+b3BzLT5lcHBfd3JpdGVfYWRkcihwcCwgdG1wLCAxLCAwKSAhPSAxKQorCQlnb3RvIGVwcHRpbWVvdXQ7CisJLyoKKwkgKiBpbml0aWFsaXNlIGhkbGMgdmFyaWFibGVzCisJICovCisJYmMtPmhkbGNyeC5zdGF0ZSA9IDA7CisJYmMtPmhkbGNyeC5udW1iaXRzID0gMDsKKwliYy0+aGRsY3R4LnN0YXRlID0gdHhfaWRsZTsKKwliYy0+aGRsY3R4LmJ1ZmNudCA9IDA7CisJYmMtPmhkbGN0eC5zbG90Y250ID0gYmMtPmNoX3BhcmFtcy5zbG90dGltZTsKKwliYy0+aGRsY3R4LmNhbGlicmF0ZSA9IDA7CisJLyogc3RhcnQgdGhlIGJvdHRvbSBoYWxmIHN0dWZmICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZiYy0+cnVuX3dvcmssIDEpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7CisKKyBlcHB0aW1lb3V0OgorCXByaW50ayhLRVJOX0VSUiAiJXM6IGVwcCB0aW1lb3V0IGR1cmluZyBiaXRyYXRlIHByb2JlXG4iLCBiY19kcnZuYW1lKTsKKwlwYXJwb3J0X3dyaXRlX2NvbnRyb2wocHAsIDApOyAvKiByZXNldCB0aGUgYWRhcHRlciAqLworICAgICAgICBwYXJwb3J0X3JlbGVhc2UoYmMtPnBkZXYpOworICAgICAgICBwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKGJjLT5wZGV2KTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZXBwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwYXJwb3J0ICpwcCA9IGJjLT5wZGV2LT5wb3J0OworCXVuc2lnbmVkIGNoYXIgdG1wWzFdOworCisJYmMtPndvcmtfcnVubmluZyA9IDA7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwliYy0+c3RhdCA9IEVQUF9EQ0RCSVQ7CisJdG1wWzBdID0gMDsKKwlwcC0+b3BzLT5lcHBfd3JpdGVfYWRkcihwcCwgdG1wLCAxLCAwKTsKKwlwYXJwb3J0X3dyaXRlX2NvbnRyb2wocHAsIDApOyAvKiByZXNldCB0aGUgYWRhcHRlciAqLworICAgICAgICBwYXJwb3J0X3JlbGVhc2UoYmMtPnBkZXYpOworICAgICAgICBwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKGJjLT5wZGV2KTsKKwlpZiAoYmMtPnNrYikKKwkJZGV2X2tmcmVlX3NrYihiYy0+c2tiKTsKKwliYy0+c2tiID0gTlVMTDsKKwlwcmludGsoS0VSTl9JTkZPICIlczogY2xvc2UgZXBwIGF0IGlvYmFzZSAweCVseCBpcnEgJXVcbiIsCisJICAgICAgIGJjX2Rydm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJheWNvbV9zZXRtb2RlKHN0cnVjdCBiYXljb21fc3RhdGUgKmJjLCBjb25zdCBjaGFyICptb2Rlc3RyKQoreworCWNvbnN0IGNoYXIgKmNwOworCisJaWYgKHN0cnN0cihtb2Rlc3RyLCJpbnRjbGsiKSkKKwkJYmMtPmNmZy5pbnRjbGsgPSAxOworCWlmIChzdHJzdHIobW9kZXN0ciwiZXh0Y2xrIikpCisJCWJjLT5jZmcuaW50Y2xrID0gMDsKKwlpZiAoc3Ryc3RyKG1vZGVzdHIsImludG1vZGVtIikpCisJCWJjLT5jZmcuZXh0bW9kZW0gPSAwOworCWlmIChzdHJzdHIobW9kZXN0ciwiZXh0bW9kZW0iKSkKKwkJYmMtPmNmZy5leHRtb2RlbSA9IDE7CisJaWYgKHN0cnN0cihtb2Rlc3RyLCJub2xvb3BiYWNrIikpCisJCWJjLT5jZmcubG9vcGJhY2sgPSAwOworCWlmIChzdHJzdHIobW9kZXN0ciwibG9vcGJhY2siKSkKKwkJYmMtPmNmZy5sb29wYmFjayA9IDE7CisJaWYgKChjcCA9IHN0cnN0cihtb2Rlc3RyLCJmY2xrPSIpKSkgeworCQliYy0+Y2ZnLmZjbGsgPSBzaW1wbGVfc3RydG91bChjcCs1LCBOVUxMLCAwKTsKKwkJaWYgKGJjLT5jZmcuZmNsayA8IDEwMDAwMDApCisJCQliYy0+Y2ZnLmZjbGsgPSAxMDAwMDAwOworCQlpZiAoYmMtPmNmZy5mY2xrID4gMjUwMDAwMDApCisJCQliYy0+Y2ZnLmZjbGsgPSAyNTAwMDAwMDsKKwl9CisJaWYgKChjcCA9IHN0cnN0cihtb2Rlc3RyLCJicHM9IikpKSB7CisJCWJjLT5jZmcuYnBzID0gc2ltcGxlX3N0cnRvdWwoY3ArNCwgTlVMTCwgMCk7CisJCWlmIChiYy0+Y2ZnLmJwcyA8IDEwMDApCisJCQliYy0+Y2ZnLmJwcyA9IDEwMDA7CisJCWlmIChiYy0+Y2ZnLmJwcyA+IDE1MDAwMDApCisJCQliYy0+Y2ZnLmJwcyA9IDE1MDAwMDA7CisJfQorCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBiYXljb21faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBoZGxjZHJ2X2lvY3RsIGhpOworCisJaWYgKGNtZCAhPSBTSU9DREVWUFJJVkFURSkKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaGksIGlmci0+aWZyX2RhdGEsIHNpemVvZihoaSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzd2l0Y2ggKGhpLmNtZCkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwljYXNlIEhETENEUlZDVExfR0VUQ0hBTk5FTFBBUjoKKwkJaGkuZGF0YS5jcC50eF9kZWxheSA9IGJjLT5jaF9wYXJhbXMudHhfZGVsYXk7CisJCWhpLmRhdGEuY3AudHhfdGFpbCA9IGJjLT5jaF9wYXJhbXMudHhfdGFpbDsKKwkJaGkuZGF0YS5jcC5zbG90dGltZSA9IGJjLT5jaF9wYXJhbXMuc2xvdHRpbWU7CisJCWhpLmRhdGEuY3AucHBlcnNpc3QgPSBiYy0+Y2hfcGFyYW1zLnBwZXJzaXN0OworCQloaS5kYXRhLmNwLmZ1bGxkdXAgPSBiYy0+Y2hfcGFyYW1zLmZ1bGxkdXA7CisJCWJyZWFrOworCisJY2FzZSBIRExDRFJWQ1RMX1NFVENIQU5ORUxQQVI6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQliYy0+Y2hfcGFyYW1zLnR4X2RlbGF5ID0gaGkuZGF0YS5jcC50eF9kZWxheTsKKwkJYmMtPmNoX3BhcmFtcy50eF90YWlsID0gaGkuZGF0YS5jcC50eF90YWlsOworCQliYy0+Y2hfcGFyYW1zLnNsb3R0aW1lID0gaGkuZGF0YS5jcC5zbG90dGltZTsKKwkJYmMtPmNoX3BhcmFtcy5wcGVyc2lzdCA9IGhpLmRhdGEuY3AucHBlcnNpc3Q7CisJCWJjLT5jaF9wYXJhbXMuZnVsbGR1cCA9IGhpLmRhdGEuY3AuZnVsbGR1cDsKKwkJYmMtPmhkbGN0eC5zbG90Y250ID0gMTsKKwkJcmV0dXJuIDA7CisJCQorCWNhc2UgSERMQ0RSVkNUTF9HRVRNT0RFTVBBUjoKKwkJaGkuZGF0YS5tcC5pb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwkJaGkuZGF0YS5tcC5pcnEgPSBkZXYtPmlycTsKKwkJaGkuZGF0YS5tcC5kbWEgPSBkZXYtPmRtYTsKKwkJaGkuZGF0YS5tcC5kbWEyID0gMDsKKwkJaGkuZGF0YS5tcC5zZXJpb2Jhc2UgPSAwOworCQloaS5kYXRhLm1wLnBhcmlvYmFzZSA9IDA7CisJCWhpLmRhdGEubXAubWlkaWlvYmFzZSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBIRExDRFJWQ1RMX1NFVE1PREVNUEFSOgorCQlpZiAoKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKSB8fCBuZXRpZl9ydW5uaW5nKGRldikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJZGV2LT5iYXNlX2FkZHIgPSBoaS5kYXRhLm1wLmlvYmFzZTsKKwkJZGV2LT5pcnEgPSAvKmhpLmRhdGEubXAuaXJxKi8wOworCQlkZXYtPmRtYSA9IC8qaGkuZGF0YS5tcC5kbWEqLzA7CisJCXJldHVybiAwOwkKKwkJCisJY2FzZSBIRExDRFJWQ1RMX0dFVFNUQVQ6CisJCWhpLmRhdGEuY3MucHR0ID0gISEoYmMtPnN0YXQgJiBFUFBfUFRUQklUKTsKKwkJaGkuZGF0YS5jcy5kY2QgPSAhKGJjLT5zdGF0ICYgRVBQX0RDREJJVCk7CisJCWhpLmRhdGEuY3MucHR0X2tleWVkID0gYmMtPnB0dF9rZXllZDsKKwkJaGkuZGF0YS5jcy50eF9wYWNrZXRzID0gYmMtPnN0YXRzLnR4X3BhY2tldHM7CisJCWhpLmRhdGEuY3MudHhfZXJyb3JzID0gYmMtPnN0YXRzLnR4X2Vycm9yczsKKwkJaGkuZGF0YS5jcy5yeF9wYWNrZXRzID0gYmMtPnN0YXRzLnJ4X3BhY2tldHM7CisJCWhpLmRhdGEuY3MucnhfZXJyb3JzID0gYmMtPnN0YXRzLnJ4X2Vycm9yczsKKwkJYnJlYWs7CQkKKworCWNhc2UgSERMQ0RSVkNUTF9PTERHRVRTVEFUOgorCQloaS5kYXRhLm9jcy5wdHQgPSAhIShiYy0+c3RhdCAmIEVQUF9QVFRCSVQpOworCQloaS5kYXRhLm9jcy5kY2QgPSAhKGJjLT5zdGF0ICYgRVBQX0RDREJJVCk7CisJCWhpLmRhdGEub2NzLnB0dF9rZXllZCA9IGJjLT5wdHRfa2V5ZWQ7CisJCWJyZWFrOwkJCisKKwljYXNlIEhETENEUlZDVExfQ0FMSUJSQVRFOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJYmMtPmhkbGN0eC5jYWxpYnJhdGUgPSBoaS5kYXRhLmNhbGlicmF0ZSAqIGJjLT5iaXRyYXRlIC8gODsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhETENEUlZDVExfRFJJVkVSTkFNRToKKwkJc3RybmNweShoaS5kYXRhLmRyaXZlcm5hbWUsICJiYXljb21fZXBwIiwgc2l6ZW9mKGhpLmRhdGEuZHJpdmVybmFtZSkpOworCQlicmVhazsKKwkJCisJY2FzZSBIRExDRFJWQ1RMX0dFVE1PREU6CisJCXNwcmludGYoaGkuZGF0YS5tb2RlbmFtZSwgIiVzY2xrLCVzbW9kZW0sZmNsaz0lZCxicHM9JWQlcyIsIAorCQkJYmMtPmNmZy5pbnRjbGsgPyAiaW50IiA6ICJleHQiLAorCQkJYmMtPmNmZy5leHRtb2RlbSA/ICJleHQiIDogImludCIsIGJjLT5jZmcuZmNsaywgYmMtPmNmZy5icHMsCisJCQliYy0+Y2ZnLmxvb3BiYWNrID8gIixsb29wYmFjayIgOiAiIik7CisJCWJyZWFrOworCisJY2FzZSBIRExDRFJWQ1RMX1NFVE1PREU6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSB8fCBuZXRpZl9ydW5uaW5nKGRldikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJaGkuZGF0YS5tb2RlbmFtZVtzaXplb2YoaGkuZGF0YS5tb2RlbmFtZSktMV0gPSAnXDAnOworCQlyZXR1cm4gYmF5Y29tX3NldG1vZGUoYmMsIGhpLmRhdGEubW9kZW5hbWUpOworCisJY2FzZSBIRExDRFJWQ1RMX01PREVMSVNUOgorCQlzdHJuY3B5KGhpLmRhdGEubW9kZW5hbWUsICJpbnRjbGssZXh0Y2xrLGludG1vZGVtLGV4dG1vZGVtLGRpdmlkZXI9eCIsCisJCQlzaXplb2YoaGkuZGF0YS5tb2RlbmFtZSkpOworCQlicmVhazsKKworCWNhc2UgSERMQ0RSVkNUTF9NT0RFTVBBUk1BU0s6CisJCXJldHVybiBIRExDRFJWX1BBUk1BU0tfSU9CQVNFOworCisJfQorCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJmhpLCBzaXplb2YoaGkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogQ2hlY2sgZm9yIGEgbmV0d29yayBhZGFwdG9yIG9mIHRoaXMgdHlwZSwgYW5kIHJldHVybiAnMCcgaWYgb25lIGV4aXN0cy4KKyAqIElmIGRldi0+YmFzZV9hZGRyID09IDAsIHByb2JlIGFsbCBsaWtlbHkgbG9jYXRpb25zLgorICogSWYgZGV2LT5iYXNlX2FkZHIgPT0gMSwgYWx3YXlzIHJldHVybiBmYWlsdXJlLgorICogSWYgZGV2LT5iYXNlX2FkZHIgPT0gMiwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBkZXZpY2UgYW5kIHJldHVybiBzdWNjZXNzCisgKiAoZGV0YWNoYWJsZSBkZXZpY2VzIG9ubHkpLgorICovCitzdGF0aWMgdm9pZCBiYXljb21fcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgY2hhciBheDI1X2JjYXN0W0FYMjVfQUREUl9MRU5dID0geworCQknUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnMCcgPDwgMQorCX07CisJc3RhdGljIGNoYXIgYXgyNV9ub2NhbGxbQVgyNV9BRERSX0xFTl0gPSB7CisJCSdMJyA8PCAxLCAnSScgPDwgMSwgJ04nIDw8IDEsICdVJyA8PCAxLCAnWCcgPDwgMSwgJyAnIDw8IDEsICcxJyA8PCAxCisJfTsKKwljb25zdCBzdHJ1Y3QgaGRsY2Rydl9jaGFubmVsX3BhcmFtcyBkZmx0X2NoX3BhcmFtcyA9IHsgCisJCTIwLCAyLCAxMCwgNDAsIDAgCisJfTsKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYzsKKworCS8qCisJICogbm90IGEgcmVhbCBwcm9iZSEgb25seSBpbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcworCSAqLworCWJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkvKgorCSAqIGluaXRpYWxpemUgdGhlIGJheWNvbV9zdGF0ZSBzdHJ1Y3QKKwkgKi8KKwliYy0+Y2hfcGFyYW1zID0gZGZsdF9jaF9wYXJhbXM7CisJYmMtPnB0dF9rZXllZCA9IDA7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3QKKwkgKi8KKwlkZXYtPm9wZW4gPSBlcHBfb3BlbjsKKwlkZXYtPnN0b3AgPSBlcHBfY2xvc2U7CisJZGV2LT5kb19pb2N0bCA9IGJheWNvbV9pb2N0bDsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJheWNvbV9zZW5kX3BhY2tldDsKKwlkZXYtPmdldF9zdGF0cyA9IGJheWNvbV9nZXRfc3RhdHM7CisKKwkvKiBGaWxsIGluIHRoZSBmaWVsZHMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwliYy0+c2tiID0gTlVMTDsKKwkKKyNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKwlkZXYtPmhhcmRfaGVhZGVyID0gYXgyNV9lbmNhcHN1bGF0ZTsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyID0gYXgyNV9yZWJ1aWxkX2hlYWRlcjsKKyNlbHNlIC8qIENPTkZJR19BWDI1IHx8IENPTkZJR19BWDI1X01PRFVMRSAqLworCWRldi0+aGFyZF9oZWFkZXIgPSBOVUxMOworCWRldi0+cmVidWlsZF9oZWFkZXIgPSBOVUxMOworI2VuZGlmIC8qIENPTkZJR19BWDI1IHx8IENPTkZJR19BWDI1X01PRFVMRSAqLworCWRldi0+c2V0X21hY19hZGRyZXNzID0gYmF5Y29tX3NldF9tYWNfYWRkcmVzczsKKwkKKwlkZXYtPnR5cGUgPSBBUlBIUkRfQVgyNTsgICAgICAgICAgIC8qIEFGX0FYMjUgZGV2aWNlICovCisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBBWDI1X01BWF9IRUFERVJfTEVOICsgQVgyNV9CUFFfSEVBREVSX0xFTjsKKwlkZXYtPm10dSA9IEFYMjVfREVGX1BBQ0xFTjsgICAgICAgIC8qIGV0aF9tdHUgaXMgdGhlIGRlZmF1bHQgKi8KKwlkZXYtPmFkZHJfbGVuID0gQVgyNV9BRERSX0xFTjsgICAgIC8qIHNpemVvZiBhbiBheC4yNSBhZGRyZXNzICovCisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCBheDI1X2JjYXN0LCBBWDI1X0FERFJfTEVOKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYXgyNV9ub2NhbGwsIEFYMjVfQUREUl9MRU4pOworCWRldi0+dHhfcXVldWVfbGVuID0gMTY7CisKKwkvKiBOZXcgc3R5bGUgZmxhZ3MgKi8KKwlkZXYtPmZsYWdzID0gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjb21tYW5kIGxpbmUgc2V0dGFibGUgcGFyYW1ldGVycworICovCitzdGF0aWMgY29uc3QgY2hhciAqbW9kZVtOUl9QT1JUU10gPSB7ICIiLCB9Oworc3RhdGljIGludCBpb2Jhc2VbTlJfUE9SVFNdID0geyAweDM3OCwgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1vZGUsIGNoYXJwLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZSwgImJheWNvbSBvcGVyYXRpbmcgbW9kZSIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvYmFzZSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW9iYXNlLCAiYmF5Y29tIGlvIGJhc2UgYWRkcmVzcyIpOworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgTS4gU2FpbGVyLCBzYWlsZXJAaWZlLmVlLmV0aHouY2gsIGhiOWpueEBoYjl3LmNoZS5ldSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCYXljb20gZXBwIGFtYXRldXIgcmFkaW8gbW9kZW0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgYmF5Y29tX2VwcF9kZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKgorCSAqIGluaXRpYWxpemUgcGFydCBvZiB0aGUgYmF5Y29tX3N0YXRlIHN0cnVjdAorCSAqLworCWJjLT5tYWdpYyA9IEJBWUNPTV9NQUdJQzsKKwliYy0+Y2ZnLmZjbGsgPSAxOTY2NjYwMDsKKwliYy0+Y2ZnLmJwcyA9IDk2MDA7CisJLyoKKwkgKiBpbml0aWFsaXplIHBhcnQgb2YgdGhlIGRldmljZSBzdHJ1Y3QKKwkgKi8KKwliYXljb21fcHJvYmUoZGV2KTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9iYXljb21lcHAodm9pZCkKK3sKKwlpbnQgaSwgZm91bmQgPSAwOworCWNoYXIgc2V0X2h3ID0gMTsKKworCXByaW50ayhiY19kcnZpbmZvKTsKKwkvKgorCSAqIHJlZ2lzdGVyIG5ldCBkZXZpY2VzCisJICovCisJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwkJCisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGJheWNvbV9zdGF0ZSksICJiY2UlZCIsCisJCQkJICAgYmF5Y29tX2VwcF9kZXZfc2V0dXApOworCisJCWlmICghZGV2KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJiY2UlZCA6IG91dCBvZiBtZW1vcnlcbiIsIGkpOworCQkJcmV0dXJuIGZvdW5kID8gMCA6IC1FTk9NRU07CisJCX0KKwkJCQorCQlzcHJpbnRmKGRldi0+bmFtZSwgImJjZSVkIiwgaSk7CisJCWRldi0+YmFzZV9hZGRyID0gaW9iYXNlW2ldOworCisJCWlmICghbW9kZVtpXSkKKwkJCXNldF9odyA9IDA7CisJCWlmICghc2V0X2h3KQorCQkJaW9iYXNlW2ldID0gMDsKKworCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSAlc1xuIiwgYmNfZHJ2bmFtZSwgZGV2LT5uYW1lKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc2V0X2h3ICYmIGJheWNvbV9zZXRtb2RlKG5ldGRldl9wcml2KGRldiksIG1vZGVbaV0pKQorCQkJc2V0X2h3ID0gMDsKKwkJYmF5Y29tX2RldmljZVtpXSA9IGRldjsKKwkJZm91bmQrKzsKKwl9CisKKwlyZXR1cm4gZm91bmQgPyAwIDogLUVOWElPOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9iYXljb21lcHAodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJheWNvbV9kZXZpY2VbaV07CisKKwkJaWYgKGRldikgeworCQkJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCQkJaWYgKGJjLT5tYWdpYyA9PSBCQVlDT01fTUFHSUMpIHsKKwkJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQl9IGVsc2UKKwkJCQlwcmludGsocGFyYW5vaWFfc3RyLCAiY2xlYW51cF9tb2R1bGUiKTsKKwkJfQorCX0KK30KKworbW9kdWxlX2luaXQoaW5pdF9iYXljb21lcHApOworbW9kdWxlX2V4aXQoY2xlYW51cF9iYXljb21lcHApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBNT0RVTEUKKworLyoKKyAqIGZvcm1hdDogYmF5Y29tX2VwcD1pbyxtb2RlCisgKiBtb2RlOiBmcGdhIGNvbmZpZyBvcHRpb25zCisgKi8KKworc3RhdGljIGludCBfX2luaXQgYmF5Y29tX2VwcF9zZXR1cChjaGFyICpzdHIpCit7CisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBfX2luaXRkYXRhIG5yX2RldiA9IDA7CisJaW50IGludHNbMl07CisKKyAgICAgICAgaWYgKG5yX2RldiA+PSBOUl9QT1JUUykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIDIsIGludHMpOworCWlmIChpbnRzWzBdIDwgMSkKKwkJcmV0dXJuIDA7CisJbW9kZVtucl9kZXZdID0gc3RyOworCWlvYmFzZVtucl9kZXZdID0gaW50c1sxXTsKKwlucl9kZXYrKzsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYmF5Y29tX2VwcD0iLCBiYXljb21fZXBwX3NldHVwKTsKKworI2VuZGlmIC8qIE1PRFVMRSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fcGFyLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fcGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyYWQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9wYXIuYwpAQCAtMCwwICsxLDU3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJYmF5Y29tX3Bhci5jICAtLSBiYXljb20gcGFyOTYgYW5kIHBpY3BhciByYWRpbyBtb2RlbSBkcml2ZXIuCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAgIFRob21hcyBTYWlsZXIgKHNhaWxlckBpZmUuZWUuZXRoei5jaCkKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgR1BMIGFsbG93cyB5b3UgdG8gdXNlIHRoZSBkcml2ZXIsIE5PVCB0aGUgcmFkaW8uCisgKiAgSW4gb3JkZXIgdG8gdXNlIHRoZSByYWRpbywgeW91IG5lZWQgYSBsaWNlbnNlIGZyb20gdGhlIGNvbW11bmljYXRpb25zCisgKiAgYXV0aG9yaXR5IG9mIHlvdXIgY291bnRyeS4KKyAqCisgKgorICogIFN1cHBvcnRlZCBtb2RlbXMKKyAqCisgKiAgcGFyOTY6ICBUaGlzIGlzIGEgbW9kZW0gZm9yIDk2MDAgYmF1ZCBGU0sgY29tcGF0aWJsZSB0byB0aGUgRzNSVUggc3RhbmRhcmQuCisgKiAgICAgICAgICBUaGUgbW9kZW0gZG9lcyBhbGwgdGhlIGZpbHRlcmluZyBhbmQgcmVnZW5lcmF0ZXMgdGhlIHJlY2VpdmVyIGNsb2NrLgorICogICAgICAgICAgRGF0YSBpcyB0cmFuc2ZlcnJlZCBmcm9tIGFuZCB0byB0aGUgUEMgdmlhIGEgc2hpZnQgcmVnaXN0ZXIuCisgKiAgICAgICAgICBUaGUgc2hpZnQgcmVnaXN0ZXIgaXMgZmlsbGVkIHdpdGggMTYgYml0cyBhbmQgYW4gaW50ZXJydXB0IGlzCisgKiAgICAgICAgICBzaWduYWxsZWQuIFRoZSBQQyB0aGVuIGVtcHRpZXMgdGhlIHNoaWZ0IHJlZ2lzdGVyIGluIGEgYnVyc3QuIFRoaXMKKyAqICAgICAgICAgIG1vZGVtIGNvbm5lY3RzIHRvIHRoZSBwYXJhbGxlbCBwb3J0LCBoZW5jZSB0aGUgbmFtZS4gVGhlIG1vZGVtCisgKiAgICAgICAgICBsZWF2ZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBIRExDIHByb3RvY29sIGFuZCB0aGUgc2NyYW1ibGVyCisgKiAgICAgICAgICBwb2x5bm9taWFsIHRvIHRoZSBQQy4gVGhpcyBtb2RlbSBpcyBubyBsb25nZXIgYXZhaWxhYmxlIChhdCBsZWFzdAorICogICAgICAgICAgZnJvbSBCYXljb20pIGFuZCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgUElDUEFSIG1vZGVtIChzZWUgYmVsb3cpLgorICogICAgICAgICAgWW91IG1heSBob3dldmVyIHN0aWxsIGJ1aWxkIG9uZSBmcm9tIHRoZSBzY2hlbWF0aWNzIHB1Ymxpc2hlZCBpbgorICogICAgICAgICAgY3EtREwgOi0pLgorICoKKyAqICBwaWNwYXI6IFRoaXMgaXMgYSByZWRlc2lnbiBvZiB0aGUgcGFyOTYgbW9kZW0gYnkgSGVubmluZyBSZWNoLCBERjlJQy4gVGhlCisgKiAgICAgICAgICBtb2RlbSBpcyBwcm90b2NvbCBjb21wYXRpYmxlIHRvIHBhcjk2LCBidXQgdXNlcyBvbmx5IHRocmVlIGxvdworICogICAgICAgICAgcG93ZXIgSUNzIGFuZCBjYW4gdGhlcmVmb3JlIGJlIGZlZCBmcm9tIHRoZSBwYXJhbGxlbCBwb3J0IGFuZAorICogICAgICAgICAgZG9lcyBub3QgcmVxdWlyZSBhbiBhZGRpdGlvbmFsIHBvd2VyIHN1cHBseS4gSXQgZmVhdHVyZXMKKyAqICAgICAgICAgIGJ1aWx0IGluIERDRCBjaXJjdWl0cnkuIFRoZSBkcml2ZXIgc2hvdWxkIHRoZXJlZm9yZSBiZSBjb25maWd1cmVkCisgKiAgICAgICAgICBmb3IgaGFyZHdhcmUgRENELgorICoKKyAqCisgKiAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgKGluc21vZCBjb21tYW5kIGxpbmUpCisgKgorICogIG1vZGUgICAgIGRyaXZlciBtb2RlIHN0cmluZy4gVmFsaWQgY2hvaWNlcyBhcmUgcGFyOTYgYW5kIHBpY3Bhci4KKyAqICBpb2Jhc2UgICBiYXNlIGFkZHJlc3Mgb2YgdGhlIHBvcnQ7IGNvbW1vbiB2YWx1ZXMgYXJlIDB4Mzc4LCAweDI3OCwgMHgzYmMKKyAqCisgKgorICogIEhpc3Rvcnk6CisgKiAgIDAuMSAgMjYuMDYuMTk5NiAgQWRhcHRlZCBmcm9tIGJheWNvbS5jIGFuZCBtYWRlIG5ldHdvcmsgZHJpdmVyIGludGVyZmFjZQorICogICAgICAgIDE4LjEwLjE5OTYgIENoYW5nZWQgdG8gbmV3IHVzZXIgc3BhY2UgYWNjZXNzIHJvdXRpbmVzIChjb3B5X3t0byxmcm9tfV91c2VyKQorICogICAwLjMgIDI2LjA0LjE5OTcgIGluaXQgY29kZS9kYXRhIHRhZ2dlZAorICogICAwLjQgIDA4LjA3LjE5OTcgIGFsdGVybmF0aXZlIHNlcjEyIGRlY29kaW5nIGFsZ29yaXRobSAodXNlcyBkZWx0YSBDVFMgaW50cykKKyAqICAgMC41ICAxMS4xMS4xOTk3ICBzcGxpdCBpbnRvIHNlcGFyYXRlIGZpbGVzIGZvciBzZXIxMi9wYXI5NgorICogICAwLjYgIDAzLjA4LjE5OTkgIGFkYXB0IHRvIExpbnVzJyBuZXcgX19zZXR1cC9fX2luaXRjYWxsCisgKiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCBzb21lIHByZS0yLjIga2VybmVsIGNvbXBhdGliaWxpdHkgY3J1ZnQKKyAqICAgMC43ICAxMC4wOC4xOTk5ICBDaGVjayBpZiBwYXJwb3J0IGNhbiBkbyBTUFAgYW5kIGlzIHNhZmUgdG8gYWNjZXNzIGR1cmluZyBpbnRlcnJ1cHQgY29udGV4dHMKKyAqICAgMC44ICAxMi4wMi4yMDAwICBhZGFwdGVkIHRvIHNvZnRuZXQgZHJpdmVyIGludGVyZmFjZQorICogICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgZGlyZWN0IHBhcnBvcnQgYWNjZXNzLCB1c2VzIHBhcnBvcnQgZHJpdmVyIG1ldGhvZHMKKyAqICAgMC45ICAwMy4wNy4yMDAwICBmaXggaW50ZXJmYWNlIG5hbWUgaGFuZGxpbmcKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGNkcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9iYXljb20uaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vYnVnLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEJBWUNPTV9ERUJVRworCisvKgorICogbW9kZW0gb3B0aW9uczsgYml0IG1hc2sKKyAqLworI2RlZmluZSBCQVlDT01fT1BUSU9OU19TT0ZURENEICAxCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciBiY19kcnZuYW1lW10gPSAiYmF5Y29tX3BhciI7CitzdGF0aWMgY29uc3QgY2hhciBiY19kcnZpbmZvW10gPSBLRVJOX0lORk8gImJheWNvbV9wYXI6IChDKSAxOTk2LTIwMDAgVGhvbWFzIFNhaWxlciwgSEI5Sk5YL0FFNFdBXG4iCitLRVJOX0lORk8gImJheWNvbV9wYXI6IHZlcnNpb24gMC45IGNvbXBpbGVkICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE5SX1BPUlRTIDQKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpiYXljb21fZGV2aWNlW05SX1BPUlRTXTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUEFSOTZfQlVSU1RCSVRTIDE2CisjZGVmaW5lIFBBUjk2X0JVUlNUICAgICA0CisjZGVmaW5lIFBBUjk2X1BUVCAgICAgICAyCisjZGVmaW5lIFBBUjk2X1RYQklUICAgICAxCisjZGVmaW5lIFBBUjk2X0FDSyAgICAgICAweDQwCisjZGVmaW5lIFBBUjk2X1JYQklUICAgICAweDIwCisjZGVmaW5lIFBBUjk2X0RDRCAgICAgICAweDEwCisjZGVmaW5lIFBBUjk3X1BPV0VSICAgICAweGY4CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4KKyAqLworCitzdHJ1Y3QgYmF5Y29tX3N0YXRlIHsKKwlzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSBoZHJ2OworCisJc3RydWN0IHBhcmRldmljZSAqcGRldjsKKwl1bnNpZ25lZCBpbnQgb3B0aW9uczsKKworCXN0cnVjdCBtb2RlbV9zdGF0ZSB7CisJCXNob3J0IGFyYl9kaXZpZGVyOworCQl1bnNpZ25lZCBjaGFyIGZsYWdzOworCQl1bnNpZ25lZCBpbnQgc2hyZWc7CisJCXN0cnVjdCBtb2RlbV9zdGF0ZV9wYXI5NiB7CisJCQlpbnQgZGNkX2NvdW50OworCQkJdW5zaWduZWQgaW50IGRjZF9zaHJlZzsKKwkJCXVuc2lnbmVkIGxvbmcgZGVzY3JhbTsKKwkJCXVuc2lnbmVkIGxvbmcgc2NyYW07CisJCX0gcGFyOTY7CisJfSBtb2RlbTsKKworI2lmZGVmIEJBWUNPTV9ERUJVRworCXN0cnVjdCBkZWJ1Z192YWxzIHsKKwkJdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7CisJCXVuc2lnbmVkIGN1cl9pbnRjbnQ7CisJCXVuc2lnbmVkIGxhc3RfaW50Y250OworCQlpbnQgY3VyX3BsbGNvcnI7CisJCWludCBsYXN0X3BsbGNvcnI7CisJfSBkZWJ1Z192YWxzOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gYmF5Y29tX2ludF9mcmVxKHN0cnVjdCBiYXljb21fc3RhdGUgKmJjKQoreworI2lmZGVmIEJBWUNPTV9ERUJVRworCXVuc2lnbmVkIGxvbmcgY3VyX2ppZmZpZXMgPSBqaWZmaWVzOworCS8qCisJICogbWVhc3VyZSB0aGUgaW50ZXJydXB0IGZyZXF1ZW5jeQorCSAqLworCWJjLT5kZWJ1Z192YWxzLmN1cl9pbnRjbnQrKzsKKwlpZiAoKGN1cl9qaWZmaWVzIC0gYmMtPmRlYnVnX3ZhbHMubGFzdF9qaWZmaWVzKSA+PSBIWikgeworCQliYy0+ZGVidWdfdmFscy5sYXN0X2ppZmZpZXMgPSBjdXJfamlmZmllczsKKwkJYmMtPmRlYnVnX3ZhbHMubGFzdF9pbnRjbnQgPSBiYy0+ZGVidWdfdmFscy5jdXJfaW50Y250OworCQliYy0+ZGVidWdfdmFscy5jdXJfaW50Y250ID0gMDsKKwkJYmMtPmRlYnVnX3ZhbHMubGFzdF9wbGxjb3JyID0gYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnI7CisJCWJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyID0gMDsKKwl9CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PSBQQVI5NiBzcGVjaWZpYyByb3V0aW5lcyA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2RlZmluZSBQQVI5Nl9ERVNDUkFNX1RBUDEgMHgyMDAwMAorI2RlZmluZSBQQVI5Nl9ERVNDUkFNX1RBUDIgMHgwMTAwMAorI2RlZmluZSBQQVI5Nl9ERVNDUkFNX1RBUDMgMHgwMDAwMQorCisjZGVmaW5lIFBBUjk2X0RFU0NSQU1fVEFQU0gxIDE3CisjZGVmaW5lIFBBUjk2X0RFU0NSQU1fVEFQU0gyIDEyCisjZGVmaW5lIFBBUjk2X0RFU0NSQU1fVEFQU0gzIDAKKworI2RlZmluZSBQQVI5Nl9TQ1JBTV9UQVAxIDB4MjAwMDAgLyogWF4xNyAqLworI2RlZmluZSBQQVI5Nl9TQ1JBTV9UQVBOIDB4MDAwMjEgLyogWF4wK1heNSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBwYXI5Nl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgZGF0YSA9IGhkbGNkcnZfZ2V0Yml0cygmYmMtPmhkcnYpOworCXN0cnVjdCBwYXJwb3J0ICpwcCA9IGJjLT5wZGV2LT5wb3J0OworCisJZm9yKGkgPSAwOyBpIDwgUEFSOTZfQlVSU1RCSVRTOyBpKyssIGRhdGEgPj49IDEpIHsKKwkJdW5zaWduZWQgY2hhciB2YWwgPSBQQVI5N19QT1dFUjsKKwkJYmMtPm1vZGVtLnBhcjk2LnNjcmFtID0gKChiYy0+bW9kZW0ucGFyOTYuc2NyYW0gPDwgMSkgfAorCQkJCQkgKGJjLT5tb2RlbS5wYXI5Ni5zY3JhbSAmIDEpKTsKKwkJaWYgKCEoZGF0YSAmIDEpKQorCQkJYmMtPm1vZGVtLnBhcjk2LnNjcmFtIF49IDE7CisJCWlmIChiYy0+bW9kZW0ucGFyOTYuc2NyYW0gJiAoUEFSOTZfU0NSQU1fVEFQMSA8PCAxKSkKKwkJCWJjLT5tb2RlbS5wYXI5Ni5zY3JhbSBePQorCQkJCShQQVI5Nl9TQ1JBTV9UQVBOIDw8IDEpOworCQlpZiAoYmMtPm1vZGVtLnBhcjk2LnNjcmFtICYgKFBBUjk2X1NDUkFNX1RBUDEgPDwgMikpCisJCQl2YWwgfD0gUEFSOTZfVFhCSVQ7CisJCXBwLT5vcHMtPndyaXRlX2RhdGEocHAsIHZhbCk7CisJCXBwLT5vcHMtPndyaXRlX2RhdGEocHAsIHZhbCB8IFBBUjk2X0JVUlNUKTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHBhcjk2X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBiYXljb21fc3RhdGUgKmJjKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBkYXRhLCBtYXNrLCBtYXNrMiwgZGVzY3g7CisJc3RydWN0IHBhcnBvcnQgKnBwID0gYmMtPnBkZXYtPnBvcnQ7CisKKwkvKgorCSAqIGRvIHJlY2VpdmVyOyBkaWZmZXJlbnRpYWwgZGVjb2RlIGFuZCBkZXNjcmFtYmxlIG9uIHRoZSBmbHkKKwkgKi8KKwlmb3IoZGF0YSA9IGkgPSAwOyBpIDwgUEFSOTZfQlVSU1RCSVRTOyBpKyspIHsKKwkJYmMtPm1vZGVtLnBhcjk2LmRlc2NyYW0gPSAoYmMtPm1vZGVtLnBhcjk2LmRlc2NyYW0gPDwgMSk7CisJCWlmIChwcC0+b3BzLT5yZWFkX3N0YXR1cyhwcCkgJiBQQVI5Nl9SWEJJVCkKKwkJCWJjLT5tb2RlbS5wYXI5Ni5kZXNjcmFtIHw9IDE7CisJCWRlc2N4ID0gYmMtPm1vZGVtLnBhcjk2LmRlc2NyYW0gXgorCQkJKGJjLT5tb2RlbS5wYXI5Ni5kZXNjcmFtID4+IDEpOworCQkvKiBub3cgdGhlIGRpZmYgZGVjb2RlZCBkYXRhIGlzIGludmVydGVkIGluIGRlc2NyYW0gKi8KKwkJcHAtPm9wcy0+d3JpdGVfZGF0YShwcCwgUEFSOTdfUE9XRVIgfCBQQVI5Nl9QVFQpOworCQlkZXNjeCBePSAoKGRlc2N4ID4+IFBBUjk2X0RFU0NSQU1fVEFQU0gxKSBeCisJCQkgIChkZXNjeCA+PiBQQVI5Nl9ERVNDUkFNX1RBUFNIMikpOworCQlkYXRhID4+PSAxOworCQlpZiAoIShkZXNjeCAmIDEpKQorCQkJZGF0YSB8PSAweDgwMDA7CisJCXBwLT5vcHMtPndyaXRlX2RhdGEocHAsIFBBUjk3X1BPV0VSIHwgUEFSOTZfUFRUIHwgUEFSOTZfQlVSU1QpOworCX0KKwloZGxjZHJ2X3B1dGJpdHMoJmJjLT5oZHJ2LCBkYXRhKTsKKwkvKgorCSAqIGRvIERDRCBhbGdvcml0aG0KKwkgKi8KKwlpZiAoYmMtPm9wdGlvbnMgJiBCQVlDT01fT1BUSU9OU19TT0ZURENEKSB7CisJCWJjLT5tb2RlbS5wYXI5Ni5kY2Rfc2hyZWcgPSAoYmMtPm1vZGVtLnBhcjk2LmRjZF9zaHJlZyA+PiAxNikKKwkJCXwgKGRhdGEgPDwgMTYpOworCQkvKiBzZWFyY2ggZm9yIGZsYWdzIGFuZCBzZXQgdGhlIGRjZCBjb3VudGVyIGFwcHJvcHJpYXRlbHkgKi8KKwkJZm9yKG1hc2sgPSAweDFmZTAwLCBtYXNrMiA9IDB4ZmMwMCwgaSA9IDA7CisJCSAgICBpIDwgUEFSOTZfQlVSU1RCSVRTOyBpKyssIG1hc2sgPDw9IDEsIG1hc2syIDw8PSAxKQorCQkJaWYgKChiYy0+bW9kZW0ucGFyOTYuZGNkX3NocmVnICYgbWFzaykgPT0gbWFzazIpCisJCQkJYmMtPm1vZGVtLnBhcjk2LmRjZF9jb3VudCA9IEhETENEUlZfTUFYRkxFTis0OworCQkvKiBjaGVjayBmb3IgYWJvcnQvbm9pc2Ugc2VxdWVuY2VzICovCisJCWZvcihtYXNrID0gMHgxZmUwMCwgbWFzazIgPSAweDFmZTAwLCBpID0gMDsKKwkJICAgIGkgPCBQQVI5Nl9CVVJTVEJJVFM7IGkrKywgbWFzayA8PD0gMSwgbWFzazIgPDw9IDEpCisJCQlpZiAoKChiYy0+bW9kZW0ucGFyOTYuZGNkX3NocmVnICYgbWFzaykgPT0gbWFzazIpICYmCisJCQkgICAgKGJjLT5tb2RlbS5wYXI5Ni5kY2RfY291bnQgPj0gMCkpCisJCQkJYmMtPm1vZGVtLnBhcjk2LmRjZF9jb3VudCAtPSBIRExDRFJWX01BWEZMRU4tMTA7CisJCS8qIGRlY3JlbWVudCBhbmQgc2V0IHRoZSBkY2QgdmFyaWFibGUgKi8KKwkJaWYgKGJjLT5tb2RlbS5wYXI5Ni5kY2RfY291bnQgPj0gMCkKKwkJCWJjLT5tb2RlbS5wYXI5Ni5kY2RfY291bnQgLT0gMjsKKwkJaGRsY2Rydl9zZXRkY2QoJmJjLT5oZHJ2LCBiYy0+bW9kZW0ucGFyOTYuZGNkX2NvdW50ID4gMCk7CisJfSBlbHNlIHsKKwkJaGRsY2Rydl9zZXRkY2QoJmJjLT5oZHJ2LCAhIShwcC0+b3BzLT5yZWFkX3N0YXR1cyhwcCkgJiBQQVI5Nl9EQ0QpKTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwYXI5Nl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWJheWNvbV9pbnRfZnJlcShiYyk7CisJLyoKKwkgKiBjaGVjayBpZiB0cmFuc21pdHRlciBhY3RpdmUKKwkgKi8KKwlpZiAoaGRsY2Rydl9wdHQoJmJjLT5oZHJ2KSkKKwkJcGFyOTZfdHgoZGV2LCBiYyk7CisJZWxzZSB7CisJCXBhcjk2X3J4KGRldiwgYmMpOworCQlpZiAoLS1iYy0+bW9kZW0uYXJiX2RpdmlkZXIgPD0gMCkgeworCQkJYmMtPm1vZGVtLmFyYl9kaXZpZGVyID0gNjsKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJCWhkbGNkcnZfYXJiaXRyYXRlKGRldiwgJmJjLT5oZHJ2KTsKKwkJfQorCX0KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaGRsY2Rydl90cmFuc21pdHRlcihkZXYsICZiYy0+aGRydik7CisJaGRsY2Rydl9yZWNlaXZlcihkZXYsICZiYy0+aGRydik7CisgICAgICAgIGxvY2FsX2lycV9kaXNhYmxlKCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwYXI5Nl93YWtldXAodm9pZCAqaGFuZGxlKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopaGFuZGxlOworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaW50ayhLRVJOX0RFQlVHICJiYXljb21fcGFyOiAlczogd2h5IGFtIEkgYmVpbmcgd29rZW4gdXA/XG4iLCBkZXYtPm5hbWUpOworCWlmICghcGFycG9ydF9jbGFpbShiYy0+cGRldikpCisJCXByaW50ayhLRVJOX0RFQlVHICJiYXljb21fcGFyOiAlczogSSdtIGJyb2tlbi5cbiIsIGRldi0+bmFtZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHBhcjk2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBhcnBvcnQgKnBwOworCisJaWYgKCFkZXYgfHwgIWJjKQorCQlyZXR1cm4gLUVOWElPOworCXBwID0gcGFycG9ydF9maW5kX2Jhc2UoZGV2LT5iYXNlX2FkZHIpOworCWlmICghcHApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXljb21fcGFyOiBwYXJwb3J0IGF0IDB4JWx4IHVua25vd25cbiIsIGRldi0+YmFzZV9hZGRyKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJaWYgKHBwLT5pcnEgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYmF5Y29tX3BhcjogcGFycG9ydCBhdCAweCVseCBoYXMgbm8gaXJxXG4iLCBwcC0+YmFzZSk7CisJCXBhcnBvcnRfcHV0X3BvcnQocHApOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAoKH5wcC0+bW9kZXMpICYgKFBBUlBPUlRfTU9ERV9QQ1NQUCB8IFBBUlBPUlRfTU9ERV9TQUZFSU5JTlQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYmF5Y29tX3BhcjogcGFycG9ydCBhdCAweCVseCBjYW5ub3QgYmUgdXNlZFxuIiwgcHAtPmJhc2UpOworCQlwYXJwb3J0X3B1dF9wb3J0KHBwKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJbWVtc2V0KCZiYy0+bW9kZW0sIDAsIHNpemVvZihiYy0+bW9kZW0pKTsKKwliYy0+aGRydi5wYXIuYml0cmF0ZSA9IDk2MDA7CisJYmMtPnBkZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwcCwgZGV2LT5uYW1lLCBOVUxMLCBwYXI5Nl93YWtldXAsIAorCQkJCSBwYXI5Nl9pbnRlcnJ1cHQsIFBBUlBPUlRfREVWX0VYQ0wsIGRldik7CisJcGFycG9ydF9wdXRfcG9ydChwcCk7CisJaWYgKCFiYy0+cGRldikgeworCQlwcmludGsoS0VSTl9FUlIgImJheWNvbV9wYXI6IGNhbm5vdCByZWdpc3RlciBwYXJwb3J0IGF0IDB4JWx4XG4iLCBkZXYtPmJhc2VfYWRkcik7CisJCXJldHVybiAtRU5YSU87CisJfQorCWlmIChwYXJwb3J0X2NsYWltKGJjLT5wZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgImJheWNvbV9wYXI6IHBhcnBvcnQgYXQgMHglbHggYnVzeVxuIiwgcHAtPmJhc2UpOworCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKGJjLT5wZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcHAgPSBiYy0+cGRldi0+cG9ydDsKKwlkZXYtPmlycSA9IHBwLT5pcnE7CisJcHAtPm9wcy0+ZGF0YV9mb3J3YXJkKHBwKTsKKyAgICAgICAgYmMtPmhkcnYucGFyLmJpdHJhdGUgPSA5NjAwOworCXBwLT5vcHMtPndyaXRlX2RhdGEocHAsIFBBUjk2X1BUVCB8IFBBUjk3X1BPV0VSKTsgLyogc3dpdGNoIG9mZiBQVFQgKi8KKwlwcC0+b3BzLT5lbmFibGVfaXJxKHBwKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogcGFyOTYgYXQgaW9iYXNlIDB4JWx4IGlycSAldSBvcHRpb25zIDB4JXhcbiIsCisJICAgICAgIGJjX2Rydm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgYmMtPm9wdGlvbnMpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBwYXI5Nl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGFycG9ydCAqcHA7CisKKwlpZiAoIWRldiB8fCAhYmMpCisJCXJldHVybiAtRUlOVkFMOworCXBwID0gYmMtPnBkZXYtPnBvcnQ7CisJLyogZGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwlwcC0+b3BzLT5kaXNhYmxlX2lycShwcCk7CisJLyogc3dpdGNoIG9mZiBQVFQgKi8KKwlwcC0+b3BzLT53cml0ZV9kYXRhKHBwLCBQQVI5Nl9QVFQgfCBQQVI5N19QT1dFUik7CisJcGFycG9ydF9yZWxlYXNlKGJjLT5wZGV2KTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKGJjLT5wZGV2KTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogY2xvc2UgcGFyOTYgYXQgaW9iYXNlIDB4JWx4IGlycSAldVxuIiwKKwkgICAgICAgYmNfZHJ2bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09IGhkbGNkcnYgZHJpdmVyIGludGVyZmFjZSA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworc3RhdGljIGludCBiYXljb21faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsCisJCQlzdHJ1Y3QgaGRsY2Rydl9pb2N0bCAqaGksIGludCBjbWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBoZGxjZHJ2X29wcyBwYXI5Nl9vcHMgPSB7CisJLmRydm5hbWUgPSBiY19kcnZuYW1lLAorCS5kcnZpbmZvID0gYmNfZHJ2aW5mbywKKwkub3BlbiAgICA9IHBhcjk2X29wZW4sCisJLmNsb3NlICAgPSBwYXI5Nl9jbG9zZSwKKwkuaW9jdGwgICA9IGJheWNvbV9pb2N0bAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX3NldG1vZGUoc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMsIGNvbnN0IGNoYXIgKm1vZGVzdHIpCit7CisJaWYgKCFzdHJuY21wKG1vZGVzdHIsICJwaWNwYXIiLCA2KSkKKwkJYmMtPm9wdGlvbnMgPSAwOworCWVsc2UgaWYgKCFzdHJuY21wKG1vZGVzdHIsICJwYXI5NiIsIDUpKQorCQliYy0+b3B0aW9ucyA9IEJBWUNPTV9PUFRJT05TX1NPRlREQ0Q7CisJZWxzZQorCQliYy0+b3B0aW9ucyA9ICEhc3RyY2hyKG1vZGVzdHIsICcqJyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJheWNvbV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwKKwkJCXN0cnVjdCBoZGxjZHJ2X2lvY3RsICpoaSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYzsKKwlzdHJ1Y3QgYmF5Y29tX2lvY3RsIGJpOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCUJVR19PTihiYy0+aGRydi5tYWdpYyAhPSBIRExDRFJWX01BR0lDKTsKKworCWlmIChjbWQgIT0gU0lPQ0RFVlBSSVZBVEUpCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJc3dpdGNoIChoaS0+Y21kKSB7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisKKwljYXNlIEhETENEUlZDVExfR0VUTU9ERToKKwkJc3RyY3B5KGhpLT5kYXRhLm1vZGVuYW1lLCBiYy0+b3B0aW9ucyA/ICJwYXI5NiIgOiAicGljcGFyIik7CisJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgaGksIHNpemVvZihzdHJ1Y3QgaGRsY2Rydl9pb2N0bCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBIRExDRFJWQ1RMX1NFVE1PREU6CisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikgfHwgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJaGktPmRhdGEubW9kZW5hbWVbc2l6ZW9mKGhpLT5kYXRhLm1vZGVuYW1lKS0xXSA9ICdcMCc7CisJCXJldHVybiBiYXljb21fc2V0bW9kZShiYywgaGktPmRhdGEubW9kZW5hbWUpOworCisJY2FzZSBIRExDRFJWQ1RMX01PREVMSVNUOgorCQlzdHJjcHkoaGktPmRhdGEubW9kZW5hbWUsICJwYXI5NixwaWNwYXIiKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCBoaSwgc2l6ZW9mKHN0cnVjdCBoZGxjZHJ2X2lvY3RsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhETENEUlZDVExfTU9ERU1QQVJNQVNLOgorCQlyZXR1cm4gSERMQ0RSVl9QQVJNQVNLX0lPQkFTRTsKKworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmYmksIGlmci0+aWZyX2RhdGEsIHNpemVvZihiaSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzd2l0Y2ggKGJpLmNtZCkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKyNpZmRlZiBCQVlDT01fREVCVUcKKwljYXNlIEJBWUNPTUNUTF9HRVRERUJVRzoKKwkJYmkuZGF0YS5kYmcuZGVidWcxID0gYmMtPmhkcnYucHR0X2tleWVkOworCQliaS5kYXRhLmRiZy5kZWJ1ZzIgPSBiYy0+ZGVidWdfdmFscy5sYXN0X2ludGNudDsKKwkJYmkuZGF0YS5kYmcuZGVidWczID0gYmMtPmRlYnVnX3ZhbHMubGFzdF9wbGxjb3JyOworCQlicmVhazsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KKworCX0KKwlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZiaSwgc2l6ZW9mKGJpKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogY29tbWFuZCBsaW5lIHNldHRhYmxlIHBhcmFtZXRlcnMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKm1vZGVbTlJfUE9SVFNdID0geyAicGljcGFyIiwgfTsKK3N0YXRpYyBpbnQgaW9iYXNlW05SX1BPUlRTXSA9IHsgMHgzNzgsIH07CisKK21vZHVsZV9wYXJhbV9hcnJheShtb2RlLCBjaGFycCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGUsICJiYXljb20gb3BlcmF0aW5nIG1vZGU7IGVnLiBwYXI5NiBvciBwaWNwYXIiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpb2Jhc2UsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvYmFzZSwgImJheWNvbSBpbyBiYXNlIGFkZHJlc3MiKTsKKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIE0uIFNhaWxlciwgc2FpbGVyQGlmZS5lZS5ldGh6LmNoLCBoYjlqbnhAaGI5dy5jaGUuZXUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmF5Y29tIHBhcjk2IGFuZCBwaWNwYXIgYW1hdGV1ciByYWRpbyBtb2RlbSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYmF5Y29tcGFyKHZvaWQpCit7CisJaW50IGksIGZvdW5kID0gMDsKKwljaGFyIHNldF9odyA9IDE7CisKKwlwcmludGsoYmNfZHJ2aW5mbyk7CisJLyoKKwkgKiByZWdpc3RlciBuZXQgZGV2aWNlcworCSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjOworCQljaGFyIGlmbmFtZVtJRk5BTVNJWl07CisKKwkJc3ByaW50ZihpZm5hbWUsICJiY3AlZCIsIGkpOworCisJCWlmICghbW9kZVtpXSkKKwkJCXNldF9odyA9IDA7CisJCWlmICghc2V0X2h3KQorCQkJaW9iYXNlW2ldID0gMDsKKworCQlkZXYgPSBoZGxjZHJ2X3JlZ2lzdGVyKCZwYXI5Nl9vcHMsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmF5Y29tX3N0YXRlKSwKKwkJCQkgICAgICAgaWZuYW1lLCBpb2Jhc2VbaV0sIDAsIDApOworCQlpZiAoSVNfRVJSKGRldikpIAorCQkJYnJlYWs7CisKKwkJYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCQlpZiAoc2V0X2h3ICYmIGJheWNvbV9zZXRtb2RlKGJjLCBtb2RlW2ldKSkKKwkJCXNldF9odyA9IDA7CisJCWZvdW5kKys7CisJCWJheWNvbV9kZXZpY2VbaV0gPSBkZXY7CisJfQorCisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfYmF5Y29tcGFyKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBiYXljb21fZGV2aWNlW2ldOworCisJCWlmIChkZXYpCisJCQloZGxjZHJ2X3VucmVnaXN0ZXIoZGV2KTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGluaXRfYmF5Y29tcGFyKTsKK21vZHVsZV9leGl0KGNsZWFudXBfYmF5Y29tcGFyKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTU9EVUxFCisKKy8qCisgKiBmb3JtYXQ6IGJheWNvbV9wYXI9aW8sbW9kZQorICogbW9kZTogcGFyOTYscGljcGFyCisgKi8KKworc3RhdGljIGludCBfX2luaXQgYmF5Y29tX3Bhcl9zZXR1cChjaGFyICpzdHIpCit7CisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBucl9kZXY7CisJaW50IGludHNbMl07CisKKyAgICAgICAgaWYgKG5yX2RldiA+PSBOUl9QT1JUUykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3RyID0gZ2V0X29wdGlvbnMoc3RyLCAyLCBpbnRzKTsKKyAgICAgICAgaWYgKGludHNbMF0gPCAxKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBtb2RlW25yX2Rldl0gPSBzdHI7CisgICAgICAgIGlvYmFzZVtucl9kZXZdID0gaW50c1sxXTsKKwlucl9kZXYrKzsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYmF5Y29tX3Bhcj0iLCBiYXljb21fcGFyX3NldHVwKTsKKworI2VuZGlmIC8qIE1PRFVMRSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2ZkeC5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9mZHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWYyNzBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9mZHguYwpAQCAtMCwwICsxLDcwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJYmF5Y29tX3Nlcl9mZHguYyAgLS0gYmF5Y29tIHNlcjEyIGZ1bGxkdXBsZXggcmFkaW8gbW9kZW0gZHJpdmVyLgorICoKKyAqCUNvcHlyaWdodCAoQykgMTk5Ni0yMDAwICBUaG9tYXMgU2FpbGVyIChzYWlsZXJAaWZlLmVlLmV0aHouY2gpCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogIFBsZWFzZSBub3RlIHRoYXQgdGhlIEdQTCBhbGxvd3MgeW91IHRvIHVzZSB0aGUgZHJpdmVyLCBOT1QgdGhlIHJhZGlvLgorICogIEluIG9yZGVyIHRvIHVzZSB0aGUgcmFkaW8sIHlvdSBuZWVkIGEgbGljZW5zZSBmcm9tIHRoZSBjb21tdW5pY2F0aW9ucworICogIGF1dGhvcml0eSBvZiB5b3VyIGNvdW50cnkuCisgKgorICoKKyAqICBTdXBwb3J0ZWQgbW9kZW1zCisgKgorICogIHNlcjEyOiAgVGhpcyBpcyBhIHZlcnkgc2ltcGxlIDEyMDAgYmF1ZCBBRlNLIG1vZGVtLiBUaGUgbW9kZW0gY29uc2lzdHMgb25seQorICogICAgICAgICAgb2YgYSBtb2R1bGF0b3IvZGVtb2R1bGF0b3IgY2hpcCwgdXN1YWxseSBhIFRJIFRDTTMxMDUuIFRoZSBjb21wdXRlcgorICogICAgICAgICAgaXMgcmVzcG9uc2libGUgZm9yIHJlZ2VuZXJhdGluZyB0aGUgcmVjZWl2ZXIgYml0IGNsb2NrLCBhcyB3ZWxsIGFzCisgKiAgICAgICAgICBmb3IgaGFuZGxpbmcgdGhlIEhETEMgcHJvdG9jb2wuIFRoZSBtb2RlbSBjb25uZWN0cyB0byBhIHNlcmlhbCBwb3J0LAorICogICAgICAgICAgaGVuY2UgdGhlIG5hbWUuIFNpbmNlIHRoZSBzZXJpYWwgcG9ydCBpcyBub3QgdXNlZCBhcyBhbiBhc3luYyBzZXJpYWwKKyAqICAgICAgICAgIHBvcnQsIHRoZSBrZXJuZWwgZHJpdmVyIGZvciBzZXJpYWwgcG9ydHMgY2Fubm90IGJlIHVzZWQsIGFuZCB0aGlzCisgKiAgICAgICAgICBkcml2ZXIgb25seSBzdXBwb3J0cyBzdGFuZGFyZCBzZXJpYWwgaGFyZHdhcmUgKDgyNTAsIDE2NDUwLCAxNjU1MEEpCisgKgorICogICAgICAgICAgVGhpcyBtb2RlbSB1c3VhbGx5IGRyYXdzIGl0cyBzdXBwbHkgY3VycmVudCBvdXQgb2YgdGhlIG90aGVyd2lzZSB1bnVzZWQKKyAqICAgICAgICAgIFRYRCBwaW4gb2YgdGhlIHNlcmlhbCBwb3J0LiBUaHVzIGEgY29udGlnbnVvdXMgc3RyZWFtIG9mIDB4MDAtYnl0ZXMKKyAqICAgICAgICAgIGlzIHRyYW5zbWl0dGVkIHRvIGFjaGlldmUgYSBwb3NpdGl2ZSBzdXBwbHkgdm9sdGFnZS4KKyAqCisgKiAgaHNrOiAgICBUaGlzIGlzIGEgNDgwMCBiYXVkIEZTSyBtb2RlbSwgZGVzaWduZWQgZm9yIFROQyB1c2UuIEl0IHdvcmtzIGZpbmUKKyAqICAgICAgICAgIGluICdiYXljb20tbW9kZScgOi0pICBJbiBjb250cmFzdCB0byB0aGUgVENNMzEwNSBtb2RlbSwgcG93ZXIgaXMKKyAqICAgICAgICAgIGV4dGVybmFsbHkgc3VwcGxpZWQuIFNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBwcm92aWRlIHRoZSAweDAwLWJ5dGUtc3RyZWFtCisgKiAgICAgICAgICB3aGVuIHJlY2VpdmluZyBvciBpZGxlLCB3aGljaCBkcmFzdGljYWxseSByZWR1Y2VzIGludGVycnVwdCBsb2FkLgorICoKKyAqICBDb21tYW5kIGxpbmUgb3B0aW9ucyAoaW5zbW9kIGNvbW1hbmQgbGluZSkKKyAqCisgKiAgbW9kZSAgICAgc2VyIyAgICBoYXJkd2FyZSBEQ0QKKyAqICAgICAgICAgICBzZXIjKiAgIHNvZnR3YXJlIERDRAorICogICAgICAgICAgIHNlciMrICAgaGFyZHdhcmUgRENELCBpbnZlcnRlZCBzaWduYWwgYXQgRENEIHBpbgorICogICAgICAgICAgICcjJyBkZW5vdGVzIHRoZSBiYXVkIHJhdGUgLyAxMDAsIGVnLiBzZXIxMiogaXMgJzEyMDAgYmF1ZCwgc29mdCBEQ0QnCisgKiAgaW9iYXNlICAgYmFzZSBhZGRyZXNzIG9mIHRoZSBwb3J0OyBjb21tb24gdmFsdWVzIGFyZSAweDNmOCwgMHgyZjgsIDB4M2U4LCAweDJlOAorICogIGJhdWQgICAgIGJhdWQgcmF0ZSAoYmV0d2VlbiAzMDAgYW5kIDQ4MDApCisgKiAgaXJxICAgICAgaW50ZXJydXB0IGxpbmUgb2YgdGhlIHBvcnQ7IGNvbW1vbiB2YWx1ZXMgYXJlIDQsMworICoKKyAqCisgKiAgSGlzdG9yeToKKyAqICAgMC4xICAyNi4wNi4xOTk2ICBBZGFwdGVkIGZyb20gYmF5Y29tLmMgYW5kIG1hZGUgbmV0d29yayBkcml2ZXIgaW50ZXJmYWNlCisgKiAgICAgICAgMTguMTAuMTk5NiAgQ2hhbmdlZCB0byBuZXcgdXNlciBzcGFjZSBhY2Nlc3Mgcm91dGluZXMgKGNvcHlfe3RvLGZyb219X3VzZXIpCisgKiAgIDAuMyAgMjYuMDQuMTk5NyAgaW5pdCBjb2RlL2RhdGEgdGFnZ2VkCisgKiAgIDAuNCAgMDguMDcuMTk5NyAgYWx0ZXJuYXRpdmUgc2VyMTIgZGVjb2RpbmcgYWxnb3JpdGhtICh1c2VzIGRlbHRhIENUUyBpbnRzKQorICogICAwLjUgIDExLjExLjE5OTcgIHNlcjEyL3Bhcjk2IHNwbGl0IGludG8gc2VwYXJhdGUgZmlsZXMKKyAqICAgMC42ICAyNC4wMS4xOTk4ICBUaG9yc3RlbiBLcmFuemtvd3NraSwgZGw4YmN1IGFuZCBUaG9tYXMgU2FpbGVyOgorICogICAgICAgICAgICAgICAgICAgIHJlZHVjZWQgaW50ZXJydXB0IGxvYWQgaW4gdHJhbnNtaXQgY2FzZQorICogICAgICAgICAgICAgICAgICAgIHJld29ya2VkIHJlY2VpdmVyCisgKiAgIDAuNyAgMDMuMDguMTk5OSAgYWRhcHQgdG8gTGludXMnIG5ldyBfX3NldHVwL19faW5pdGNhbGwKKyAqICAgMC44ICAxMC4wOC4xOTk5ICB1c2UgbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQKKyAqICAgMC45ICAxMi4wMi4yMDAwICBhZGFwdGVkIHRvIHNvZnRuZXQgZHJpdmVyIGludGVyZmFjZQorICogICAwLjEwIDAzLjA3LjIwMDAgIGZpeCBpbnRlcmZhY2UgbmFtZSBoYW5kbGluZworICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGNkcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9iYXljb20uaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQkFZQ09NX0RFQlVHCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciBiY19kcnZuYW1lW10gPSAiYmF5Y29tX3Nlcl9mZHgiOworc3RhdGljIGNvbnN0IGNoYXIgYmNfZHJ2aW5mb1tdID0gS0VSTl9JTkZPICJiYXljb21fc2VyX2ZkeDogKEMpIDE5OTYtMjAwMCBUaG9tYXMgU2FpbGVyLCBIQjlKTlgvQUU0V0FcbiIKK0tFUk5fSU5GTyAiYmF5Y29tX3Nlcl9mZHg6IHZlcnNpb24gMC4xMCBjb21waWxlZCAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBOUl9QT1JUUyA0CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYmF5Y29tX2RldmljZVtOUl9QT1JUU107CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJCUihpb2Jhc2UpIChpb2Jhc2UrMCkKKyNkZWZpbmUgVEhSKGlvYmFzZSkgKGlvYmFzZSswKQorI2RlZmluZSBJRVIoaW9iYXNlKSAoaW9iYXNlKzEpCisjZGVmaW5lIElJUihpb2Jhc2UpIChpb2Jhc2UrMikKKyNkZWZpbmUgRkNSKGlvYmFzZSkgKGlvYmFzZSsyKQorI2RlZmluZSBMQ1IoaW9iYXNlKSAoaW9iYXNlKzMpCisjZGVmaW5lIE1DUihpb2Jhc2UpIChpb2Jhc2UrNCkKKyNkZWZpbmUgTFNSKGlvYmFzZSkgKGlvYmFzZSs1KQorI2RlZmluZSBNU1IoaW9iYXNlKSAoaW9iYXNlKzYpCisjZGVmaW5lIFNDUihpb2Jhc2UpIChpb2Jhc2UrNykKKyNkZWZpbmUgRExMKGlvYmFzZSkgKGlvYmFzZSswKQorI2RlZmluZSBETE0oaW9iYXNlKSAoaW9iYXNlKzEpCisKKyNkZWZpbmUgU0VSMTJfRVhURU5UIDgKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLgorICovCisKK3N0cnVjdCBiYXljb21fc3RhdGUgeworCXN0cnVjdCBoZGxjZHJ2X3N0YXRlIGhkcnY7CisKKwl1bnNpZ25lZCBpbnQgYmF1ZCwgYmF1ZF91cywgYmF1ZF9hcmJkaXYsIGJhdWRfdWFydGRpdiwgYmF1ZF9kY2R0aW1lb3V0OworCWludCBvcHRfZGNkOworCisJc3RydWN0IG1vZGVtX3N0YXRlIHsKKwkJdW5zaWduZWQgY2hhciBmbGFnczsKKwkJdW5zaWduZWQgY2hhciBwdHQ7CisJCXVuc2lnbmVkIGludCBzaHJlZzsKKwkJc3RydWN0IG1vZGVtX3N0YXRlX3NlcjEyIHsKKwkJCXVuc2lnbmVkIGNoYXIgdHhfYml0OworCQkJdW5zaWduZWQgY2hhciBsYXN0X3J4Yml0OworCQkJaW50IGRjZF9zdW0wLCBkY2Rfc3VtMSwgZGNkX3N1bTI7CisJCQlpbnQgZGNkX3RpbWU7CisJCQl1bnNpZ25lZCBpbnQgcGxsX3RpbWU7CisJCQl1bnNpZ25lZCBpbnQgdHhzaHJlZzsKKwkJfSBzZXIxMjsKKwl9IG1vZGVtOworCisjaWZkZWYgQkFZQ09NX0RFQlVHCisJc3RydWN0IGRlYnVnX3ZhbHMgeworCQl1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKKwkJdW5zaWduZWQgY3VyX2ludGNudDsKKwkJdW5zaWduZWQgbGFzdF9pbnRjbnQ7CisJCWludCBjdXJfcGxsY29ycjsKKwkJaW50IGxhc3RfcGxsY29ycjsKKwl9IGRlYnVnX3ZhbHM7CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGJheWNvbV9pbnRfZnJlcShzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYykKK3sKKyNpZmRlZiBCQVlDT01fREVCVUcKKwl1bnNpZ25lZCBsb25nIGN1cl9qaWZmaWVzID0gamlmZmllczsKKwkvKgorCSAqIG1lYXN1cmUgdGhlIGludGVycnVwdCBmcmVxdWVuY3kKKwkgKi8KKwliYy0+ZGVidWdfdmFscy5jdXJfaW50Y250Kys7CisJaWYgKChjdXJfamlmZmllcyAtIGJjLT5kZWJ1Z192YWxzLmxhc3RfamlmZmllcykgPj0gSFopIHsKKwkJYmMtPmRlYnVnX3ZhbHMubGFzdF9qaWZmaWVzID0gY3VyX2ppZmZpZXM7CisJCWJjLT5kZWJ1Z192YWxzLmxhc3RfaW50Y250ID0gYmMtPmRlYnVnX3ZhbHMuY3VyX2ludGNudDsKKwkJYmMtPmRlYnVnX3ZhbHMuY3VyX2ludGNudCA9IDA7CisJCWJjLT5kZWJ1Z192YWxzLmxhc3RfcGxsY29yciA9IGJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyOworCQliYy0+ZGVidWdfdmFscy5jdXJfcGxsY29yciA9IDA7CisJfQorI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT0gU0VSMTIgc3BlY2lmaWMgcm91dGluZXMgPT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2VyMTJfc2V0X2Rpdmlzb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGl2aXNvcikKK3sKKyAgICAgICAgb3V0YigweDgxLCBMQ1IoZGV2LT5iYXNlX2FkZHIpKTsgICAgICAgIC8qIERMQUIgPSAxICovCisgICAgICAgIG91dGIoZGl2aXNvciwgRExMKGRldi0+YmFzZV9hZGRyKSk7CisgICAgICAgIG91dGIoZGl2aXNvciA+PiA4LCBETE0oZGV2LT5iYXNlX2FkZHIpKTsKKyAgICAgICAgb3V0YigweDAxLCBMQ1IoZGV2LT5iYXNlX2FkZHIpKTsgICAgICAgIC8qIHdvcmQgbGVuZ3RoID0gNiAqLworICAgICAgICAvKgorICAgICAgICAgKiBtYWtlIHN1cmUgdGhlIG5leHQgaW50ZXJydXB0IGlzIGdlbmVyYXRlZDsKKyAgICAgICAgICogMCBtdXN0IGJlIHVzZWQgdG8gcG93ZXIgdGhlIG1vZGVtOyB0aGUgbW9kZW0gZHJhd3MgaXRzCisgICAgICAgICAqIHBvd2VyIGZyb20gdGhlIFR4RCBsaW5lCisgICAgICAgICAqLworICAgICAgICBvdXRiKDB4MDAsIFRIUihkZXYtPmJhc2VfYWRkcikpOworICAgICAgICAvKgorICAgICAgICAgKiBpdCBpcyBpbXBvcnRhbnQgbm90IHRvIHNldCB0aGUgZGl2aWRlciB3aGlsZSB0cmFuc21pdHRpbmc7CisgICAgICAgICAqIHRoaXMgcmVwb3J0ZWRseSBtYWtlcyBzb21lIFVBUlRzIGdlbmVyYXRpbmcgaW50ZXJydXB0cworICAgICAgICAgKiBpbiB0aGUgaHVuZHJlZHRob3VzYW5kcyBwZXIgc2Vjb25kIHJlZ2lvbgorICAgICAgICAgKiBSZXBvcnRlZCBieTogSWduYWNpby5BcmVuYXphQHN0dWRpLmVwZmwuY2ggKElnbmFjaW8gQXJlbmF6YSBOdW5vKQorICAgICAgICAgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAwCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBod2VpZ2h0MTYodW5zaWduZWQgaW50IHcpCisgICAgICAgIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGh3ZWlnaHQ4KHVuc2lnbmVkIGludCB3KQorICAgICAgICBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGh3ZWlnaHQxNih1bnNpZ25lZCBpbnQgdykKK3sKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcmVzID0gKHcgJiAweDU1NTUpICsgKCh3ID4+IDEpICYgMHg1NTU1KTsKKyAgICAgICAgcmVzID0gKHJlcyAmIDB4MzMzMykgKyAoKHJlcyA+PiAyKSAmIDB4MzMzMyk7CisgICAgICAgIHJlcyA9IChyZXMgJiAweDBGMEYpICsgKChyZXMgPj4gNCkgJiAweDBGMEYpOworICAgICAgICByZXR1cm4gKHJlcyAmIDB4MDBGRikgKyAoKHJlcyA+PiA4KSAmIDB4MDBGRik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGh3ZWlnaHQ4KHVuc2lnbmVkIGludCB3KQoreworICAgICAgICB1bnNpZ25lZCBzaG9ydCByZXMgPSAodyAmIDB4NTUpICsgKCh3ID4+IDEpICYgMHg1NSk7CisgICAgICAgIHJlcyA9IChyZXMgJiAweDMzKSArICgocmVzID4+IDIpICYgMHgzMyk7CisgICAgICAgIHJldHVybiAocmVzICYgMHgwRikgKyAoKHJlcyA+PiA0KSAmIDB4MEYpOworfQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNlcjEyX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBiYXljb21fc3RhdGUgKmJjLCBzdHJ1Y3QgdGltZXZhbCAqdHYsIHVuc2lnbmVkIGNoYXIgY3VycykKK3sKKwlpbnQgdGltZWRpZmY7CisJaW50IGJkdXM4ID0gYmMtPmJhdWRfdXMgPj4gMzsKKwlpbnQgYmR1czQgPSBiYy0+YmF1ZF91cyA+PiAyOworCWludCBiZHVzMiA9IGJjLT5iYXVkX3VzID4+IDE7CisKKwl0aW1lZGlmZiA9IDEwMDAwMDAgKyB0di0+dHZfdXNlYyAtIGJjLT5tb2RlbS5zZXIxMi5wbGxfdGltZTsKKwl3aGlsZSAodGltZWRpZmYgPj0gNTAwMDAwKQorCQl0aW1lZGlmZiAtPSAxMDAwMDAwOworCXdoaWxlICh0aW1lZGlmZiA+PSBiZHVzMikgeworCQl0aW1lZGlmZiAtPSBiYy0+YmF1ZF91czsKKwkJYmMtPm1vZGVtLnNlcjEyLnBsbF90aW1lICs9IGJjLT5iYXVkX3VzOworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3RpbWUtLTsKKwkJLyogZmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgcm9vbSB0byBhZGQgYSBiaXQgKi8KKwkJaWYgKGJjLT5tb2RlbS5zaHJlZyAmIDEpIHsKKwkJCWhkbGNkcnZfcHV0Yml0cygmYmMtPmhkcnYsIChiYy0+bW9kZW0uc2hyZWcgPj4gMSkgXiAweGZmZmYpOworCQkJYmMtPm1vZGVtLnNocmVnID0gMHgxMDAwMDsKKwkJfQorCQkvKiBhZGQgYSBvbmUgYml0ICovCisJCWJjLT5tb2RlbS5zaHJlZyA+Pj0gMTsKKwl9CisJaWYgKGJjLT5tb2RlbS5zZXIxMi5kY2RfdGltZSA8PSAwKSB7CisJCWlmICghYmMtPm9wdF9kY2QpCisJCQloZGxjZHJ2X3NldGRjZCgmYmMtPmhkcnYsIChiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTAgKyAKKwkJCQkJCSAgIGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMSArIAorCQkJCQkJICAgYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0yKSA8IDApOworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTIgPSBiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTE7CisJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMSA9IGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMDsKKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wID0gMjsgLyogc2xpZ2h0IGJpYXMgKi8KKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF90aW1lICs9IDEyMDsKKwl9CisJaWYgKGJjLT5tb2RlbS5zZXIxMi5sYXN0X3J4Yml0ICE9IGN1cnMpIHsKKwkJYmMtPm1vZGVtLnNlcjEyLmxhc3RfcnhiaXQgPSBjdXJzOworCQliYy0+bW9kZW0uc2hyZWcgfD0gMHgxMDAwMDsKKwkJLyogYWRqdXN0IHRoZSBQTEwgKi8KKwkJaWYgKHRpbWVkaWZmID4gMCkKKwkJCWJjLT5tb2RlbS5zZXIxMi5wbGxfdGltZSArPSBiZHVzODsKKwkJZWxzZQorCQkJYmMtPm1vZGVtLnNlcjEyLnBsbF90aW1lICs9IDEwMDAwMDAgLSBiZHVzODsKKwkJLyogdXBkYXRlIERDRCAqLworCQlpZiAoYWJzKHRpbWVkaWZmKSA+IGJkdXM0KQorCQkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wICs9IDQ7CisJCWVsc2UKKwkJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMC0tOworI2lmZGVmIEJBWUNPTV9ERUJVRworCQliYy0+ZGVidWdfdmFscy5jdXJfcGxsY29yciA9IHRpbWVkaWZmOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworCX0KKwl3aGlsZSAoYmMtPm1vZGVtLnNlcjEyLnBsbF90aW1lID49IDEwMDAwMDApCisJCWJjLT5tb2RlbS5zZXIxMi5wbGxfdGltZSAtPSAxMDAwMDAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlycXJldHVybl90IHNlcjEyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB0aW1ldmFsIHR2OworCXVuc2lnbmVkIGNoYXIgaWlyLCBtc3I7CisJdW5zaWduZWQgaW50IHR4Y291bnQgPSAwOworCisJaWYgKCFiYyB8fCBiYy0+aGRydi5tYWdpYyAhPSBIRExDRFJWX01BR0lDKQorCQlyZXR1cm4gSVJRX05PTkU7CisJLyogZmFzdCB3YXkgb3V0IGZvciBzaGFyZWQgaXJxICovCisJaWYgKChpaXIgPSBpbmIoSUlSKGRldi0+YmFzZV9hZGRyKSkpICYgMSkgCQorCQlyZXR1cm4gSVJRX05PTkU7CisJLyogZ2V0IGN1cnJlbnQgdGltZSAqLworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCW1zciA9IGluYihNU1IoZGV2LT5iYXNlX2FkZHIpKTsKKwkvKiBkZWx0YSBEQ0QgKi8KKwlpZiAoKG1zciAmIDgpICYmIGJjLT5vcHRfZGNkKQorCQloZGxjZHJ2X3NldGRjZCgmYmMtPmhkcnYsICEoKG1zciBeIGJjLT5vcHRfZGNkKSAmIDB4ODApKTsKKwlkbyB7CisJCXN3aXRjaCAoaWlyICYgNikgeworCQljYXNlIDY6CisJCQlpbmIoTFNSKGRldi0+YmFzZV9hZGRyKSk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIDQ6CisJCQlpbmIoUkJSKGRldi0+YmFzZV9hZGRyKSk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIDI6CisJCQkvKgorCQkJICogbWFrZSBzdXJlIHRoZSBuZXh0IGludGVycnVwdCBpcyBnZW5lcmF0ZWQ7CisJCQkgKiAwIG11c3QgYmUgdXNlZCB0byBwb3dlciB0aGUgbW9kZW07IHRoZSBtb2RlbSBkcmF3cyBpdHMKKwkJCSAqIHBvd2VyIGZyb20gdGhlIFR4RCBsaW5lCisJCQkgKi8KKwkJCW91dGIoMHgwMCwgVEhSKGRldi0+YmFzZV9hZGRyKSk7CisJCQliYXljb21faW50X2ZyZXEoYmMpOworCQkJdHhjb3VudCsrOworCQkJLyoKKwkJCSAqIGZpcnN0IG91dHB1dCB0aGUgbGFzdCBiaXQgKCEpIHRoZW4gY2FsbCBIRExDIHRyYW5zbWl0dGVyLAorCQkJICogc2luY2UgdGhpcyBtYXkgdGFrZSBxdWl0ZSBsb25nCisJCQkgKi8KKwkJCWlmIChiYy0+bW9kZW0ucHR0KQorCQkJCW91dGIoMHgwZSB8ICghIWJjLT5tb2RlbS5zZXIxMi50eF9iaXQpLCBNQ1IoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCWVsc2UKKwkJCQlvdXRiKDB4MGQsIE1DUihkZXYtPmJhc2VfYWRkcikpOyAgICAgICAvKiB0cmFuc21pdHRlciBvZmYgKi8KKwkJCWJyZWFrOworCQkJCisJCWRlZmF1bHQ6CisJCQltc3IgPSBpbmIoTVNSKGRldi0+YmFzZV9hZGRyKSk7CisJCQkvKiBkZWx0YSBEQ0QgKi8KKwkJCWlmICgobXNyICYgOCkgJiYgYmMtPm9wdF9kY2QpIAorCQkJCWhkbGNkcnZfc2V0ZGNkKCZiYy0+aGRydiwgISgobXNyIF4gYmMtPm9wdF9kY2QpICYgMHg4MCkpOworCQkJYnJlYWs7CisJCX0KKwkJaWlyID0gaW5iKElJUihkZXYtPmJhc2VfYWRkcikpOworCX0gd2hpbGUgKCEoaWlyICYgMSkpOworCXNlcjEyX3J4KGRldiwgYmMsICZ0diwgbXNyICYgMHgxMCk7IC8qIENUUyAqLworCWlmIChiYy0+bW9kZW0ucHR0ICYmIHR4Y291bnQpIHsKKwkJaWYgKGJjLT5tb2RlbS5zZXIxMi50eHNocmVnIDw9IDEpIHsKKwkJCWJjLT5tb2RlbS5zZXIxMi50eHNocmVnID0gMHgxMDAwMCB8IGhkbGNkcnZfZ2V0Yml0cygmYmMtPmhkcnYpOworCQkJaWYgKCFoZGxjZHJ2X3B0dCgmYmMtPmhkcnYpKSB7CisJCQkJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCAxMTUyMDAvMTAwLzgpOworCQkJCWJjLT5tb2RlbS5wdHQgPSAwOworCQkJCWdvdG8gZW5kX3RyYW5zbWl0OworCQkJfQorCQl9CisJCWJjLT5tb2RlbS5zZXIxMi50eF9iaXQgPSAhKGJjLT5tb2RlbS5zZXIxMi50eF9iaXQgXiAoYmMtPm1vZGVtLnNlcjEyLnR4c2hyZWcgJiAxKSk7CisJCWJjLT5tb2RlbS5zZXIxMi50eHNocmVnID4+PSAxOworCX0KKyBlbmRfdHJhbnNtaXQ6CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCWlmICghYmMtPm1vZGVtLnB0dCAmJiB0eGNvdW50KSB7CisJCWhkbGNkcnZfYXJiaXRyYXRlKGRldiwgJmJjLT5oZHJ2KTsKKwkJaWYgKGhkbGNkcnZfcHR0KCZiYy0+aGRydikpIHsKKwkJCXNlcjEyX3NldF9kaXZpc29yKGRldiwgYmMtPmJhdWRfdWFydGRpdik7CisJCQliYy0+bW9kZW0uc2VyMTIudHhzaHJlZyA9IDE7CisJCQliYy0+bW9kZW0ucHR0ID0gMTsKKwkJfQorCX0KKwloZGxjZHJ2X3RyYW5zbWl0dGVyKGRldiwgJmJjLT5oZHJ2KTsKKwloZGxjZHJ2X3JlY2VpdmVyKGRldiwgJmJjLT5oZHJ2KTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0gdWFydCB7IGNfdWFydF91bmtub3duLCBjX3VhcnRfODI1MCwKKwkgICAgY191YXJ0XzE2NDUwLCBjX3VhcnRfMTY1NTAsIGNfdWFydF8xNjU1MEF9Oworc3RhdGljIGNvbnN0IGNoYXIgKnVhcnRfc3RyW10gPSB7IAorCSJ1bmtub3duIiwgIjgyNTAiLCAiMTY0NTAiLCAiMTY1NTAiLCAiMTY1NTBBIiAKK307CisKK3N0YXRpYyBlbnVtIHVhcnQgc2VyMTJfY2hlY2tfdWFydCh1bnNpZ25lZCBpbnQgaW9iYXNlKQoreworCXVuc2lnbmVkIGNoYXIgYjEsYjIsYjM7CisJZW51bSB1YXJ0IHU7CisJZW51bSB1YXJ0IHVhcnRfdGFiW10gPQorCQl7IGNfdWFydF8xNjQ1MCwgY191YXJ0X3Vua25vd24sIGNfdWFydF8xNjU1MCwgY191YXJ0XzE2NTUwQSB9OworCisJYjEgPSBpbmIoTUNSKGlvYmFzZSkpOworCW91dGIoYjEgfCAweDEwLCBNQ1IoaW9iYXNlKSk7CS8qIGxvb3BiYWNrIG1vZGUgKi8KKwliMiA9IGluYihNU1IoaW9iYXNlKSk7CisJb3V0YigweDFhLCBNQ1IoaW9iYXNlKSk7CisJYjMgPSBpbmIoTVNSKGlvYmFzZSkpICYgMHhmMDsKKwlvdXRiKGIxLCBNQ1IoaW9iYXNlKSk7CQkJLyogcmVzdG9yZSBvbGQgdmFsdWVzICovCisJb3V0YihiMiwgTVNSKGlvYmFzZSkpOworCWlmIChiMyAhPSAweDkwKQorCQlyZXR1cm4gY191YXJ0X3Vua25vd247CisJaW5iKFJCUihpb2Jhc2UpKTsKKwlpbmIoUkJSKGlvYmFzZSkpOworCW91dGIoMHgwMSwgRkNSKGlvYmFzZSkpOwkJLyogZW5hYmxlIEZJRk9zICovCisJdSA9IHVhcnRfdGFiWyhpbmIoSUlSKGlvYmFzZSkpID4+IDYpICYgM107CisJaWYgKHUgPT0gY191YXJ0XzE2NDUwKSB7CisJCW91dGIoMHg1YSwgU0NSKGlvYmFzZSkpOworCQliMSA9IGluYihTQ1IoaW9iYXNlKSk7CisJCW91dGIoMHhhNSwgU0NSKGlvYmFzZSkpOworCQliMiA9IGluYihTQ1IoaW9iYXNlKSk7CisJCWlmICgoYjEgIT0gMHg1YSkgfHwgKGIyICE9IDB4YTUpKQorCQkJdSA9IGNfdWFydF84MjUwOworCX0KKwlyZXR1cm4gdTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc2VyMTJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwllbnVtIHVhcnQgdTsKKworCWlmICghZGV2IHx8ICFiYykKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWRldi0+YmFzZV9hZGRyIHx8IGRldi0+YmFzZV9hZGRyID4gMHgxMDAwLVNFUjEyX0VYVEVOVCB8fAorCSAgICBkZXYtPmlycSA8IDIgfHwgZGV2LT5pcnEgPiAxNSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoYmMtPmJhdWQgPCAzMDAgfHwgYmMtPmJhdWQgPiA0ODAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTRVIxMl9FWFRFTlQsICJiYXljb21fc2VyX2ZkeCIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJBWUNPTV9TRVJfRlNYOiBJL08gcG9ydCAweCUwNGx4IGJ1c3kgXG4iLCAKKwkJICAgICAgIGRldi0+YmFzZV9hZGRyKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCW1lbXNldCgmYmMtPm1vZGVtLCAwLCBzaXplb2YoYmMtPm1vZGVtKSk7CisJYmMtPmhkcnYucGFyLmJpdHJhdGUgPSBiYy0+YmF1ZDsKKwliYy0+YmF1ZF91cyA9IDEwMDAwMDAvYmMtPmJhdWQ7CisJYmMtPmJhdWRfdWFydGRpdiA9ICgxMTUyMDAvOCkvYmMtPmJhdWQ7CisJaWYgKCh1ID0gc2VyMTJfY2hlY2tfdWFydChkZXYtPmJhc2VfYWRkcikpID09IGNfdWFydF91bmtub3duKXsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNFUjEyX0VYVEVOVCk7CisJCXJldHVybiAtRUlPOworCX0KKwlvdXRiKDAsIEZDUihkZXYtPmJhc2VfYWRkcikpOyAgLyogZGlzYWJsZSBGSUZPcyAqLworCW91dGIoMHgwZCwgTUNSKGRldi0+YmFzZV9hZGRyKSk7CisJb3V0YigwLCBJRVIoZGV2LT5iYXNlX2FkZHIpKTsKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHNlcjEyX2ludGVycnVwdCwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisJCQkiYmF5Y29tX3Nlcl9mZHgiLCBkZXYpKSB7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTRVIxMl9FWFRFTlQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwkvKgorCSAqIHNldCB0aGUgU0lPIHRvIDYgQml0cy9jaGFyYWN0ZXI7IGR1cmluZyByZWNlaXZlLAorCSAqIHRoZSBiYXVkIHJhdGUgaXMgc2V0IHRvIHByb2R1Y2UgMTAwIGludHMvc2VjCisJICogdG8gZmVlZCB0aGUgY2hhbm5lbCBhcmJpdHJhdGlvbiBwcm9jZXNzLAorCSAqIGR1cmluZyB0cmFuc21pdCB0byBiYXVkIGludHMvc2VjIHRvIHJ1bgorCSAqIHRoZSB0cmFuc21pdHRlcgorCSAqLworCXNlcjEyX3NldF9kaXZpc29yKGRldiwgMTE1MjAwLzEwMC84KTsKKwkvKgorCSAqIGVuYWJsZSB0cmFuc21pdHRlciBlbXB0eSBpbnRlcnJ1cHQgYW5kIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHQKKwkgKi8KKwlvdXRiKDB4MGEsIElFUihkZXYtPmJhc2VfYWRkcikpOworCS8qCisJICogbWFrZSBzdXJlIHRoZSBuZXh0IGludGVycnVwdCBpcyBnZW5lcmF0ZWQ7CisJICogMCBtdXN0IGJlIHVzZWQgdG8gcG93ZXIgdGhlIG1vZGVtOyB0aGUgbW9kZW0gZHJhd3MgaXRzCisJICogcG93ZXIgZnJvbSB0aGUgVHhEIGxpbmUKKwkgKi8KKwlvdXRiKDB4MDAsIFRIUihkZXYtPmJhc2VfYWRkcikpOworCWhkbGNkcnZfc2V0ZGNkKCZiYy0+aGRydiwgMCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNlcl9mZHggYXQgaW9iYXNlIDB4JWx4IGlycSAldSBiYXVkICV1IHVhcnQgJXNcbiIsCisJICAgICAgIGJjX2Rydm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgYmMtPmJhdWQsIHVhcnRfc3RyW3VdKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc2VyMTJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIWRldiB8fCAhYmMpCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogZGlzYWJsZSBpbnRlcnJ1cHRzCisJICovCisJb3V0YigwLCBJRVIoZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKDEsIE1DUihkZXYtPmJhc2VfYWRkcikpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTRVIxMl9FWFRFTlQpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBjbG9zZSBzZXJfZmR4IGF0IGlvYmFzZSAweCVseCBpcnEgJXVcbiIsCisJICAgICAgIGJjX2Rydm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PSBoZGxjZHJ2IGRyaXZlciBpbnRlcmZhY2UgPT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJheWNvbV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwKKwkJCXN0cnVjdCBoZGxjZHJ2X2lvY3RsICpoaSwgaW50IGNtZCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGhkbGNkcnZfb3BzIHNlcjEyX29wcyA9IHsKKwkuZHJ2bmFtZSA9IGJjX2Rydm5hbWUsCisJLmRydmluZm8gPSBiY19kcnZpbmZvLAorCS5vcGVuICAgID0gc2VyMTJfb3BlbiwKKwkuY2xvc2UgICA9IHNlcjEyX2Nsb3NlLAorCS5pb2N0bCAgID0gYmF5Y29tX2lvY3RsLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX3NldG1vZGUoc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMsIGNvbnN0IGNoYXIgKm1vZGVzdHIpCit7CisJdW5zaWduZWQgaW50IGJhdWQ7CisKKwlpZiAoIXN0cm5jbXAobW9kZXN0ciwgInNlciIsIDMpKSB7CisJCWJhdWQgPSBzaW1wbGVfc3RydG91bChtb2Rlc3RyKzMsIE5VTEwsIDEwKTsKKwkJaWYgKGJhdWQgPj0gMyAmJiBiYXVkIDw9IDQ4KQorCQkJYmMtPmJhdWQgPSBiYXVkKjEwMDsKKwl9CisJaWYgKHN0cmNocihtb2Rlc3RyLCAnKicpKQorCQliYy0+b3B0X2RjZCA9IDA7CisJZWxzZSBpZiAoc3RyY2hyKG1vZGVzdHIsICcrJykpCisJCWJjLT5vcHRfZGNkID0gLTE7CisJZWxzZQorCQliYy0+b3B0X2RjZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJheWNvbV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwKKwkJCXN0cnVjdCBoZGxjZHJ2X2lvY3RsICpoaSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYzsKKwlzdHJ1Y3QgYmF5Y29tX2lvY3RsIGJpOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCUJVR19PTihiYy0+aGRydi5tYWdpYyAhPSBIRExDRFJWX01BR0lDKTsKKworCWlmIChjbWQgIT0gU0lPQ0RFVlBSSVZBVEUpCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJc3dpdGNoIChoaS0+Y21kKSB7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisKKwljYXNlIEhETENEUlZDVExfR0VUTU9ERToKKwkJc3ByaW50ZihoaS0+ZGF0YS5tb2RlbmFtZSwgInNlciV1IiwgYmMtPmJhdWQgLyAxMDApOworCQlpZiAoYmMtPm9wdF9kY2QgPD0gMCkKKwkJCXN0cmNhdChoaS0+ZGF0YS5tb2RlbmFtZSwgKCFiYy0+b3B0X2RjZCkgPyAiKiIgOiAiKyIpOworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsIGhpLCBzaXplb2Yoc3RydWN0IGhkbGNkcnZfaW9jdGwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSERMQ0RSVkNUTF9TRVRNT0RFOgorCQlpZiAobmV0aWZfcnVubmluZyhkZXYpIHx8ICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWhpLT5kYXRhLm1vZGVuYW1lW3NpemVvZihoaS0+ZGF0YS5tb2RlbmFtZSktMV0gPSAnXDAnOworCQlyZXR1cm4gYmF5Y29tX3NldG1vZGUoYmMsIGhpLT5kYXRhLm1vZGVuYW1lKTsKKworCWNhc2UgSERMQ0RSVkNUTF9NT0RFTElTVDoKKwkJc3RyY3B5KGhpLT5kYXRhLm1vZGVuYW1lLCAic2VyMTIsc2VyMyxzZXIyNCIpOworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsIGhpLCBzaXplb2Yoc3RydWN0IGhkbGNkcnZfaW9jdGwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSERMQ0RSVkNUTF9NT0RFTVBBUk1BU0s6CisJCXJldHVybiBIRExDRFJWX1BBUk1BU0tfSU9CQVNFIHwgSERMQ0RSVl9QQVJNQVNLX0lSUTsKKworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmYmksIGlmci0+aWZyX2RhdGEsIHNpemVvZihiaSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzd2l0Y2ggKGJpLmNtZCkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKyNpZmRlZiBCQVlDT01fREVCVUcKKwljYXNlIEJBWUNPTUNUTF9HRVRERUJVRzoKKwkJYmkuZGF0YS5kYmcuZGVidWcxID0gYmMtPmhkcnYucHR0X2tleWVkOworCQliaS5kYXRhLmRiZy5kZWJ1ZzIgPSBiYy0+ZGVidWdfdmFscy5sYXN0X2ludGNudDsKKwkJYmkuZGF0YS5kYmcuZGVidWczID0gYmMtPmRlYnVnX3ZhbHMubGFzdF9wbGxjb3JyOworCQlicmVhazsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KKworCX0KKwlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZiaSwgc2l6ZW9mKGJpKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogY29tbWFuZCBsaW5lIHNldHRhYmxlIHBhcmFtZXRlcnMKKyAqLworc3RhdGljIGNoYXIgKm1vZGVbTlJfUE9SVFNdID0geyAic2VyMTIqIiwgfTsKK3N0YXRpYyBpbnQgaW9iYXNlW05SX1BPUlRTXSA9IHsgMHgzZjgsIH07CitzdGF0aWMgaW50IGlycVtOUl9QT1JUU10gPSB7IDQsIH07CitzdGF0aWMgaW50IGJhdWRbTlJfUE9SVFNdID0geyBbMCAuLi4gTlJfUE9SVFMtMV0gPSAxMjAwIH07CisKK21vZHVsZV9wYXJhbV9hcnJheShtb2RlLCBjaGFycCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGUsICJiYXljb20gb3BlcmF0aW5nIG1vZGU7ICogZm9yIHNvZnR3YXJlIERDRCIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvYmFzZSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW9iYXNlLCAiYmF5Y29tIGlvIGJhc2UgYWRkcmVzcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiYmF5Y29tIGlycSBudW1iZXIiKTsKK21vZHVsZV9wYXJhbV9hcnJheShiYXVkLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhiYXVkLCAiYmF5Y29tIGJhdWQgcmF0ZSAoMzAwIHRvIDQ4MDApIik7CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBNLiBTYWlsZXIsIHNhaWxlckBpZmUuZWUuZXRoei5jaCwgaGI5am54QGhiOXcuY2hlLmV1Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJheWNvbSBzZXIxMiBmdWxsIGR1cGxleCBhbWF0ZXVyIHJhZGlvIG1vZGVtIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9iYXljb21zZXJmZHgodm9pZCkKK3sKKwlpbnQgaSwgZm91bmQgPSAwOworCWNoYXIgc2V0X2h3ID0gMTsKKworCXByaW50ayhiY19kcnZpbmZvKTsKKwkvKgorCSAqIHJlZ2lzdGVyIG5ldCBkZXZpY2VzCisJICovCisJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwkJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmM7CisJCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKKworCQlzcHJpbnRmKGlmbmFtZSwgImJjc2YlZCIsIGkpOworCisJCWlmICghbW9kZVtpXSkKKwkJCXNldF9odyA9IDA7CisJCWlmICghc2V0X2h3KQorCQkJaW9iYXNlW2ldID0gaXJxW2ldID0gMDsKKworCQlkZXYgPSBoZGxjZHJ2X3JlZ2lzdGVyKCZzZXIxMl9vcHMsIAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJheWNvbV9zdGF0ZSksCisJCQkJICAgICAgIGlmbmFtZSwgaW9iYXNlW2ldLCBpcnFbaV0sIDApOworCQlpZiAoSVNfRVJSKGRldikpIAorCQkJYnJlYWs7CisKKwkJYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCQlpZiAoc2V0X2h3ICYmIGJheWNvbV9zZXRtb2RlKGJjLCBtb2RlW2ldKSkKKwkJCXNldF9odyA9IDA7CisJCWJjLT5iYXVkID0gYmF1ZFtpXTsKKwkJZm91bmQrKzsKKwkJYmF5Y29tX2RldmljZVtpXSA9IGRldjsKKwl9CisKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gLUVOWElPOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9iYXljb21zZXJmZHgodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJheWNvbV9kZXZpY2VbaV07CisJCWlmIChkZXYpIAorCQkJaGRsY2Rydl91bnJlZ2lzdGVyKGRldik7CisJfQorfQorCittb2R1bGVfaW5pdChpbml0X2JheWNvbXNlcmZkeCk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2JheWNvbXNlcmZkeCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE1PRFVMRQorCisvKgorICogZm9ybWF0OiBiYXljb21fc2VyX2ZkeD1pbyxpcnEsbW9kZQorICogbW9kZTogc2VyIyAgICBoYXJkd2FyZSBEQ0QKKyAqICAgICAgIHNlciMqICAgc29mdHdhcmUgRENECisgKiAgICAgICBzZXIjKyAgIGhhcmR3YXJlIERDRCwgaW52ZXJ0ZWQgc2lnbmFsIGF0IERDRCBwaW4KKyAqICcjJyBkZW5vdGVzIHRoZSBiYXVkIHJhdGUgLyAxMDAsIGVnLiBzZXIxMiogaXMgJzEyMDAgYmF1ZCwgc29mdCBEQ0QnCisgKi8KKworc3RhdGljIGludCBfX2luaXQgYmF5Y29tX3Nlcl9mZHhfc2V0dXAoY2hhciAqc3RyKQoreworICAgICAgICBzdGF0aWMgdW5zaWduZWQgbnJfZGV2OworICAgICAgICBpbnQgaW50c1s0XTsKKworICAgICAgICBpZiAobnJfZGV2ID49IE5SX1BPUlRTKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIDQsIGludHMpOworICAgICAgICBpZiAoaW50c1swXSA8IDIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG1vZGVbbnJfZGV2XSA9IHN0cjsKKyAgICAgICAgaW9iYXNlW25yX2Rldl0gPSBpbnRzWzFdOworICAgICAgICBpcnFbbnJfZGV2XSA9IGludHNbMl07CisJaWYgKGludHNbMF0gPj0gMykKKwkJYmF1ZFtucl9kZXZdID0gaW50c1szXTsKKwlucl9kZXYrKzsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYmF5Y29tX3Nlcl9mZHg9IiwgYmF5Y29tX3Nlcl9mZHhfc2V0dXApOworCisjZW5kaWYgLyogTU9EVUxFICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9zZXJfaGR4LmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2hkeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYWQ4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2hkeC5jCkBAIC0wLDAgKzEsNzQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgliYXljb21fc2VyX2hkeC5jICAtLSBiYXljb20gc2VyMTIgaGFsZmR1cGxleCByYWRpbyBtb2RlbSBkcml2ZXIuCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAgIFRob21hcyBTYWlsZXIgKHNhaWxlckBpZmUuZWUuZXRoei5jaCkKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgR1BMIGFsbG93cyB5b3UgdG8gdXNlIHRoZSBkcml2ZXIsIE5PVCB0aGUgcmFkaW8uCisgKiAgSW4gb3JkZXIgdG8gdXNlIHRoZSByYWRpbywgeW91IG5lZWQgYSBsaWNlbnNlIGZyb20gdGhlIGNvbW11bmljYXRpb25zCisgKiAgYXV0aG9yaXR5IG9mIHlvdXIgY291bnRyeS4KKyAqCisgKgorICogIFN1cHBvcnRlZCBtb2RlbXMKKyAqCisgKiAgc2VyMTI6ICBUaGlzIGlzIGEgdmVyeSBzaW1wbGUgMTIwMCBiYXVkIEFGU0sgbW9kZW0uIFRoZSBtb2RlbSBjb25zaXN0cyBvbmx5CisgKiAgICAgICAgICBvZiBhIG1vZHVsYXRvci9kZW1vZHVsYXRvciBjaGlwLCB1c3VhbGx5IGEgVEkgVENNMzEwNS4gVGhlIGNvbXB1dGVyCisgKiAgICAgICAgICBpcyByZXNwb25zaWJsZSBmb3IgcmVnZW5lcmF0aW5nIHRoZSByZWNlaXZlciBiaXQgY2xvY2ssIGFzIHdlbGwgYXMKKyAqICAgICAgICAgIGZvciBoYW5kbGluZyB0aGUgSERMQyBwcm90b2NvbC4gVGhlIG1vZGVtIGNvbm5lY3RzIHRvIGEgc2VyaWFsIHBvcnQsCisgKiAgICAgICAgICBoZW5jZSB0aGUgbmFtZS4gU2luY2UgdGhlIHNlcmlhbCBwb3J0IGlzIG5vdCB1c2VkIGFzIGFuIGFzeW5jIHNlcmlhbAorICogICAgICAgICAgcG9ydCwgdGhlIGtlcm5lbCBkcml2ZXIgZm9yIHNlcmlhbCBwb3J0cyBjYW5ub3QgYmUgdXNlZCwgYW5kIHRoaXMKKyAqICAgICAgICAgIGRyaXZlciBvbmx5IHN1cHBvcnRzIHN0YW5kYXJkIHNlcmlhbCBoYXJkd2FyZSAoODI1MCwgMTY0NTAsIDE2NTUwQSkKKyAqCisgKgorICogIENvbW1hbmQgbGluZSBvcHRpb25zIChpbnNtb2QgY29tbWFuZCBsaW5lKQorICoKKyAqICBtb2RlICAgICBzZXIxMiAgICBoYXJkd2FyZSBEQ0QKKyAqICAgICAgICAgICBzZXIxMiogICBzb2Z0d2FyZSBEQ0QKKyAqICAgICAgICAgICBzZXIxMkAgICBoYXJkd2FyZS9zb2Z0d2FyZSBEQ0QsIGkuZS4gbm8gZXhwbGljaXQgRENEIHNpZ25hbCBidXQgaGFyZHdhcmUKKyAqICAgICAgICAgICAgICAgICAgICBtdXRlcyBhdWRpbyBpbnB1dCB0byB0aGUgbW9kZW0KKyAqICAgICAgICAgICBzZXIxMisgICBoYXJkd2FyZSBEQ0QsIGludmVydGVkIHNpZ25hbCBhdCBEQ0QgcGluCisgKiAgaW9iYXNlICAgYmFzZSBhZGRyZXNzIG9mIHRoZSBwb3J0OyBjb21tb24gdmFsdWVzIGFyZSAweDNmOCwgMHgyZjgsIDB4M2U4LCAweDJlOAorICogIGlycSAgICAgIGludGVycnVwdCBsaW5lIG9mIHRoZSBwb3J0OyBjb21tb24gdmFsdWVzIGFyZSA0LDMKKyAqCisgKgorICogIEhpc3Rvcnk6CisgKiAgIDAuMSAgMjYuMDYuMTk5NiAgQWRhcHRlZCBmcm9tIGJheWNvbS5jIGFuZCBtYWRlIG5ldHdvcmsgZHJpdmVyIGludGVyZmFjZQorICogICAgICAgIDE4LjEwLjE5OTYgIENoYW5nZWQgdG8gbmV3IHVzZXIgc3BhY2UgYWNjZXNzIHJvdXRpbmVzIChjb3B5X3t0byxmcm9tfV91c2VyKQorICogICAwLjMgIDI2LjA0LjE5OTcgIGluaXQgY29kZS9kYXRhIHRhZ2dlZAorICogICAwLjQgIDA4LjA3LjE5OTcgIGFsdGVybmF0aXZlIHNlcjEyIGRlY29kaW5nIGFsZ29yaXRobSAodXNlcyBkZWx0YSBDVFMgaW50cykKKyAqICAgMC41ICAxMS4xMS4xOTk3ICBzZXIxMi9wYXI5NiBzcGxpdCBpbnRvIHNlcGFyYXRlIGZpbGVzCisgKiAgIDAuNiAgMTQuMDQuMTk5OCAgY2xlYW51cHMKKyAqICAgMC43ICAwMy4wOC4xOTk5ICBhZGFwdCB0byBMaW51cycgbmV3IF9fc2V0dXAvX19pbml0Y2FsbAorICogICAwLjggIDEwLjA4LjE5OTkgIHVzZSBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdAorICogICAwLjkgIDEyLjAyLjIwMDAgIGFkYXB0ZWQgdG8gc29mdG5ldCBkcml2ZXIgaW50ZXJmYWNlCisgKiAgIDAuMTAgMDMuMDcuMjAwMCAgZml4IGludGVyZmFjZSBuYW1lIGhhbmRsaW5nCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaGRsY2Rydi5oPgorI2luY2x1ZGUgPGxpbnV4L2JheWNvbS5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBCQVlDT01fREVCVUcKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGJjX2Rydm5hbWVbXSA9ICJiYXljb21fc2VyX2hkeCI7CitzdGF0aWMgY29uc3QgY2hhciBiY19kcnZpbmZvW10gPSBLRVJOX0lORk8gImJheWNvbV9zZXJfaGR4OiAoQykgMTk5Ni0yMDAwIFRob21hcyBTYWlsZXIsIEhCOUpOWC9BRTRXQVxuIgorS0VSTl9JTkZPICJiYXljb21fc2VyX2hkeDogdmVyc2lvbiAwLjEwIGNvbXBpbGVkICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE5SX1BPUlRTIDQKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpiYXljb21fZGV2aWNlW05SX1BPUlRTXTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUkJSKGlvYmFzZSkgKGlvYmFzZSswKQorI2RlZmluZSBUSFIoaW9iYXNlKSAoaW9iYXNlKzApCisjZGVmaW5lIElFUihpb2Jhc2UpIChpb2Jhc2UrMSkKKyNkZWZpbmUgSUlSKGlvYmFzZSkgKGlvYmFzZSsyKQorI2RlZmluZSBGQ1IoaW9iYXNlKSAoaW9iYXNlKzIpCisjZGVmaW5lIExDUihpb2Jhc2UpIChpb2Jhc2UrMykKKyNkZWZpbmUgTUNSKGlvYmFzZSkgKGlvYmFzZSs0KQorI2RlZmluZSBMU1IoaW9iYXNlKSAoaW9iYXNlKzUpCisjZGVmaW5lIE1TUihpb2Jhc2UpIChpb2Jhc2UrNikKKyNkZWZpbmUgU0NSKGlvYmFzZSkgKGlvYmFzZSs3KQorI2RlZmluZSBETEwoaW9iYXNlKSAoaW9iYXNlKzApCisjZGVmaW5lIERMTShpb2Jhc2UpIChpb2Jhc2UrMSkKKworI2RlZmluZSBTRVIxMl9FWFRFTlQgOAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuCisgKi8KKworc3RydWN0IGJheWNvbV9zdGF0ZSB7CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgaGRydjsKKworCWludCBvcHRfZGNkOworCisJc3RydWN0IG1vZGVtX3N0YXRlIHsKKwkJc2hvcnQgYXJiX2RpdmlkZXI7CisJCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJCXVuc2lnbmVkIGludCBzaHJlZzsKKwkJc3RydWN0IG1vZGVtX3N0YXRlX3NlcjEyIHsKKwkJCXVuc2lnbmVkIGNoYXIgdHhfYml0OworCQkJaW50IGRjZF9zdW0wLCBkY2Rfc3VtMSwgZGNkX3N1bTI7CisJCQl1bnNpZ25lZCBjaGFyIGxhc3Rfc2FtcGxlOworCQkJdW5zaWduZWQgY2hhciBsYXN0X3J4Yml0OworCQkJdW5zaWduZWQgaW50IGRjZF9zaHJlZzsKKwkJCXVuc2lnbmVkIGludCBkY2RfdGltZTsKKwkJCXVuc2lnbmVkIGludCBiaXRfcGxsOworCQkJdW5zaWduZWQgY2hhciBpbnRlcm1fc2FtcGxlOworCQl9IHNlcjEyOworCX0gbW9kZW07CisKKyNpZmRlZiBCQVlDT01fREVCVUcKKwlzdHJ1Y3QgZGVidWdfdmFscyB7CisJCXVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOworCQl1bnNpZ25lZCBjdXJfaW50Y250OworCQl1bnNpZ25lZCBsYXN0X2ludGNudDsKKwkJaW50IGN1cl9wbGxjb3JyOworCQlpbnQgbGFzdF9wbGxjb3JyOworCX0gZGVidWdfdmFsczsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYmF5Y29tX2ludF9mcmVxKHN0cnVjdCBiYXljb21fc3RhdGUgKmJjKQoreworI2lmZGVmIEJBWUNPTV9ERUJVRworCXVuc2lnbmVkIGxvbmcgY3VyX2ppZmZpZXMgPSBqaWZmaWVzOworCS8qCisJICogbWVhc3VyZSB0aGUgaW50ZXJydXB0IGZyZXF1ZW5jeQorCSAqLworCWJjLT5kZWJ1Z192YWxzLmN1cl9pbnRjbnQrKzsKKwlpZiAoKGN1cl9qaWZmaWVzIC0gYmMtPmRlYnVnX3ZhbHMubGFzdF9qaWZmaWVzKSA+PSBIWikgeworCQliYy0+ZGVidWdfdmFscy5sYXN0X2ppZmZpZXMgPSBjdXJfamlmZmllczsKKwkJYmMtPmRlYnVnX3ZhbHMubGFzdF9pbnRjbnQgPSBiYy0+ZGVidWdfdmFscy5jdXJfaW50Y250OworCQliYy0+ZGVidWdfdmFscy5jdXJfaW50Y250ID0gMDsKKwkJYmMtPmRlYnVnX3ZhbHMubGFzdF9wbGxjb3JyID0gYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnI7CisJCWJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyID0gMDsKKwl9CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PSBTRVIxMiBzcGVjaWZpYyByb3V0aW5lcyA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNlcjEyX3NldF9kaXZpc29yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICB1bnNpZ25lZCBjaGFyIGRpdmlzb3IpCit7CisJb3V0YigweDgxLCBMQ1IoZGV2LT5iYXNlX2FkZHIpKTsJLyogRExBQiA9IDEgKi8KKwlvdXRiKGRpdmlzb3IsIERMTChkZXYtPmJhc2VfYWRkcikpOworCW91dGIoMCwgRExNKGRldi0+YmFzZV9hZGRyKSk7CisJb3V0YigweDAxLCBMQ1IoZGV2LT5iYXNlX2FkZHIpKTsJLyogd29yZCBsZW5ndGggPSA2ICovCisJLyoKKwkgKiBtYWtlIHN1cmUgdGhlIG5leHQgaW50ZXJydXB0IGlzIGdlbmVyYXRlZDsKKwkgKiAwIG11c3QgYmUgdXNlZCB0byBwb3dlciB0aGUgbW9kZW07IHRoZSBtb2RlbSBkcmF3cyBpdHMKKwkgKiBwb3dlciBmcm9tIHRoZSBUeEQgbGluZQorCSAqLworCW91dGIoMHgwMCwgVEhSKGRldi0+YmFzZV9hZGRyKSk7CisJLyoKKwkgKiBpdCBpcyBpbXBvcnRhbnQgbm90IHRvIHNldCB0aGUgZGl2aWRlciB3aGlsZSB0cmFuc21pdHRpbmc7CisJICogdGhpcyByZXBvcnRlZGx5IG1ha2VzIHNvbWUgVUFSVHMgZ2VuZXJhdGluZyBpbnRlcnJ1cHRzCisJICogaW4gdGhlIGh1bmRyZWR0aG91c2FuZHMgcGVyIHNlY29uZCByZWdpb24KKwkgKiBSZXBvcnRlZCBieTogSWduYWNpby5BcmVuYXphQHN0dWRpLmVwZmwuY2ggKElnbmFjaW8gQXJlbmF6YSBOdW5vKQorCSAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG11c3QgY2FsbCB0aGUgVFggYXJiaXRyYXRvciBldmVyeSAxMG1zCisgKi8KKyNkZWZpbmUgU0VSMTJfQVJCX0RJVklERVIoYmMpICAoYmMtPm9wdF9kY2QgPyAyNCA6IDM2KQorCQkJICAgICAgIAorI2RlZmluZSBTRVIxMl9EQ0RfSU5URVJWQUwoYmMpIChiYy0+b3B0X2RjZCA/IDEyIDogMjQwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2VyMTJfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMpCit7CisJLyogb25lIGludGVycnVwdCBwZXIgY2hhbm5lbCBiaXQgKi8KKwlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIDEyKTsKKwkvKgorCSAqIGZpcnN0IG91dHB1dCB0aGUgbGFzdCBiaXQgKCEpIHRoZW4gY2FsbCBIRExDIHRyYW5zbWl0dGVyLAorCSAqIHNpbmNlIHRoaXMgbWF5IHRha2UgcXVpdGUgbG9uZworCSAqLworCW91dGIoMHgwZSB8ICghIWJjLT5tb2RlbS5zZXIxMi50eF9iaXQpLCBNQ1IoZGV2LT5iYXNlX2FkZHIpKTsKKwlpZiAoYmMtPm1vZGVtLnNocmVnIDw9IDEpCisJCWJjLT5tb2RlbS5zaHJlZyA9IDB4MTAwMDAgfCBoZGxjZHJ2X2dldGJpdHMoJmJjLT5oZHJ2KTsKKwliYy0+bW9kZW0uc2VyMTIudHhfYml0ID0gIShiYy0+bW9kZW0uc2VyMTIudHhfYml0IF4KKwkJCQkgICAoYmMtPm1vZGVtLnNocmVnICYgMSkpOworCWJjLT5tb2RlbS5zaHJlZyA+Pj0gMTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXIxMl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYykKK3sKKwl1bnNpZ25lZCBjaGFyIGN1cl9zOworCS8qCisJICogZG8gZGVtb2R1bGF0b3IKKwkgKi8KKwljdXJfcyA9IGluYihNU1IoZGV2LT5iYXNlX2FkZHIpKSAmIDB4MTA7CS8qIHRoZSBDVFMgbGluZSAqLworCWhkbGNkcnZfY2hhbm5lbGJpdCgmYmMtPmhkcnYsIGN1cl9zKTsKKwliYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnID0gKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgPDwgMSkgfAorCQkoY3VyX3MgIT0gYmMtPm1vZGVtLnNlcjEyLmxhc3Rfc2FtcGxlKTsKKwliYy0+bW9kZW0uc2VyMTIubGFzdF9zYW1wbGUgPSBjdXJfczsKKwlpZihiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnICYgMSkgeworCQlpZiAoIWJjLT5vcHRfZGNkKSB7CisJCQl1bnNpZ25lZCBpbnQgZGNkc3BvcywgZGNkc25lZzsKKworCQkJZGNkc3BvcyA9IGRjZHNuZWcgPSAwOworCQkJZGNkc3BvcyArPSAoKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgPj4gMSkgJiAxKTsKKwkJCWlmICghKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgJiAweDdmZmZmZmZlKSkKKwkJCQlkY2RzcG9zICs9IDI7CisJCQlkY2RzbmVnICs9ICgoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyA+PiAyKSAmIDEpOworCQkJZGNkc25lZyArPSAoKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgPj4gMykgJiAxKTsKKwkJCWRjZHNuZWcgKz0gKChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnID4+IDQpICYgMSk7CisKKwkJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMCArPSAxNipkY2RzcG9zIC0gZGNkc25lZzsKKwkJfSBlbHNlCisJCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTAtLTsKKwl9CisJaWYoIWJjLT5tb2RlbS5zZXIxMi5kY2RfdGltZSkgeworCQloZGxjZHJ2X3NldGRjZCgmYmMtPmhkcnYsIChiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTAgKworCQkJCQkgICBiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTEgKworCQkJCQkgICBiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTIpIDwgMCk7CisJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMiA9IGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMTsKKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0xID0gYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wOworCQkvKiBvZmZzZXQgdG8gZW5zdXJlIERDRCBvZmYgb24gc2lsZW50IGlucHV0ICovCisJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMCA9IDI7CisJCWJjLT5tb2RlbS5zZXIxMi5kY2RfdGltZSA9IFNFUjEyX0RDRF9JTlRFUlZBTChiYyk7CisJfQorCWJjLT5tb2RlbS5zZXIxMi5kY2RfdGltZS0tOworCWlmICghYmMtPm9wdF9kY2QpIHsKKwkJLyoKKwkJICogUExMIGNvZGUgZm9yIHRoZSBpbXByb3ZlZCBzb2Z0d2FyZSBEQ0QgYWxnb3JpdGhtCisJCSAqLworCQlpZiAoYmMtPm1vZGVtLnNlcjEyLmludGVybV9zYW1wbGUpIHsKKwkJCS8qCisJCQkgKiBpbnRlcm1lZGlhdGUgc2FtcGxlOyBzZXQgdGltaW5nIGNvcnJlY3Rpb24gdG8gbm9ybWFsCisJCQkgKi8KKwkJCXNlcjEyX3NldF9kaXZpc29yKGRldiwgNCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogZG8gUExMIGNvcnJlY3Rpb24gYW5kIGNhbGwgSERMQyByZWNlaXZlcgorCQkJICovCisJCQlzd2l0Y2ggKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgJiA3KSB7CisJCQljYXNlIDE6IC8qIHRyYW5zaXRpb24gdG9vIGxhdGUgKi8KKwkJCQlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIDUpOworI2lmZGVmIEJBWUNPTV9ERUJVRworCQkJCWJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyKys7CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CS8qIHRyYW5zaXRpb24gdG9vIGVhcmx5ICovCisJCQkJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCAzKTsKKyNpZmRlZiBCQVlDT01fREVCVUcKKwkJCQliYy0+ZGVidWdfdmFscy5jdXJfcGxsY29yci0tOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIDQpOworCQkJCWJyZWFrOworCQkJfQorCQkJYmMtPm1vZGVtLnNocmVnID4+PSAxOworCQkJaWYgKGJjLT5tb2RlbS5zZXIxMi5sYXN0X3NhbXBsZSA9PQorCQkJICAgIGJjLT5tb2RlbS5zZXIxMi5sYXN0X3J4Yml0KQorCQkJCWJjLT5tb2RlbS5zaHJlZyB8PSAweDEwMDAwOworCQkJYmMtPm1vZGVtLnNlcjEyLmxhc3RfcnhiaXQgPQorCQkJCWJjLT5tb2RlbS5zZXIxMi5sYXN0X3NhbXBsZTsKKwkJfQorCQlpZiAoKytiYy0+bW9kZW0uc2VyMTIuaW50ZXJtX3NhbXBsZSA+PSAzKQorCQkJYmMtPm1vZGVtLnNlcjEyLmludGVybV9zYW1wbGUgPSAwOworCQkvKgorCQkgKiBEQ0Qgc3R1ZmYKKwkJICovCisJCWlmIChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnICYgMSkgeworCQkJdW5zaWduZWQgaW50IGRjZHNwb3MsIGRjZHNuZWc7CisKKwkJCWRjZHNwb3MgPSBkY2RzbmVnID0gMDsKKwkJCWRjZHNwb3MgKz0gKChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnID4+IDEpICYgMSk7CisJCQlkY2RzcG9zICs9ICghKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgJiAweDdmZmZmZmZlKSkKKwkJCQk8PCAxOworCQkJZGNkc25lZyArPSAoKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgPj4gMikgJiAxKTsKKwkJCWRjZHNuZWcgKz0gKChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnID4+IDMpICYgMSk7CisJCQlkY2RzbmVnICs9ICgoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyA+PiA0KSAmIDEpOworCisJCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTAgKz0gMTYqZGNkc3BvcyAtIGRjZHNuZWc7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBQTEwgYWxnb3JpdGhtIGZvciB0aGUgaGFyZHdhcmUgc3F1ZWxjaCBEQ0QgYWxnb3JpdGhtCisJCSAqLworCQlpZiAoYmMtPm1vZGVtLnNlcjEyLmludGVybV9zYW1wbGUpIHsKKwkJCS8qCisJCQkgKiBpbnRlcm1lZGlhdGUgc2FtcGxlOyBzZXQgdGltaW5nIGNvcnJlY3Rpb24gdG8gbm9ybWFsCisJCQkgKi8KKwkJCXNlcjEyX3NldF9kaXZpc29yKGRldiwgNik7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogZG8gUExMIGNvcnJlY3Rpb24gYW5kIGNhbGwgSERMQyByZWNlaXZlcgorCQkJICovCisJCQlzd2l0Y2ggKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgJiAzKSB7CisJCQljYXNlIDE6IC8qIHRyYW5zaXRpb24gdG9vIGxhdGUgKi8KKwkJCQlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIDcpOworI2lmZGVmIEJBWUNPTV9ERUJVRworCQkJCWJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyKys7CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCisJCQkJYnJlYWs7CisJCQljYXNlIDI6CS8qIHRyYW5zaXRpb24gdG9vIGVhcmx5ICovCisJCQkJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCA1KTsKKyNpZmRlZiBCQVlDT01fREVCVUcKKwkJCQliYy0+ZGVidWdfdmFscy5jdXJfcGxsY29yci0tOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIDYpOworCQkJCWJyZWFrOworCQkJfQorCQkJYmMtPm1vZGVtLnNocmVnID4+PSAxOworCQkJaWYgKGJjLT5tb2RlbS5zZXIxMi5sYXN0X3NhbXBsZSA9PQorCQkJICAgIGJjLT5tb2RlbS5zZXIxMi5sYXN0X3J4Yml0KQorCQkJCWJjLT5tb2RlbS5zaHJlZyB8PSAweDEwMDAwOworCQkJYmMtPm1vZGVtLnNlcjEyLmxhc3RfcnhiaXQgPQorCQkJCWJjLT5tb2RlbS5zZXIxMi5sYXN0X3NhbXBsZTsKKwkJfQorCQliYy0+bW9kZW0uc2VyMTIuaW50ZXJtX3NhbXBsZSA9ICFiYy0+bW9kZW0uc2VyMTIuaW50ZXJtX3NhbXBsZTsKKwkJLyoKKwkJICogRENEIHN0dWZmCisJCSAqLworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTAgLT0gKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgJiAxKTsKKwl9CisJb3V0YigweDBkLCBNQ1IoZGV2LT5iYXNlX2FkZHIpKTsJCS8qIHRyYW5zbWl0dGVyIG9mZiAqLworCWlmIChiYy0+bW9kZW0uc2hyZWcgJiAxKSB7CisJCWhkbGNkcnZfcHV0Yml0cygmYmMtPmhkcnYsIGJjLT5tb2RlbS5zaHJlZyA+PiAxKTsKKwkJYmMtPm1vZGVtLnNocmVnID0gMHgxMDAwMDsKKwl9CisJaWYoIWJjLT5tb2RlbS5zZXIxMi5kY2RfdGltZSkgeworCQlpZiAoYmMtPm9wdF9kY2QgJiAxKSAKKwkJCWhkbGNkcnZfc2V0ZGNkKCZiYy0+aGRydiwgISgoaW5iKE1TUihkZXYtPmJhc2VfYWRkcikpIF4gYmMtPm9wdF9kY2QpICYgMHg4MCkpOworCQllbHNlCisJCQloZGxjZHJ2X3NldGRjZCgmYmMtPmhkcnYsIChiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTAgKworCQkJCQkJICAgYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0xICsKKwkJCQkJCSAgIGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMikgPCAwKTsKKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0yID0gYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0xOworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTEgPSBiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTA7CisJCS8qIG9mZnNldCB0byBlbnN1cmUgRENEIG9mZiBvbiBzaWxlbnQgaW5wdXQgKi8KKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wID0gMjsKKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF90aW1lID0gU0VSMTJfRENEX0lOVEVSVkFMKGJjKTsKKwl9CisJYmMtPm1vZGVtLnNlcjEyLmRjZF90aW1lLS07Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2VyMTJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgY2hhciBpaXI7CisKKwlpZiAoIWRldiB8fCAhYmMgfHwgYmMtPmhkcnYubWFnaWMgIT0gSERMQ0RSVl9NQUdJQykKKwkJcmV0dXJuIElSUV9OT05FOworCS8qIGZhc3Qgd2F5IG91dCAqLworCWlmICgoaWlyID0gaW5iKElJUihkZXYtPmJhc2VfYWRkcikpKSAmIDEpCisJCXJldHVybiBJUlFfTk9ORTsKKwliYXljb21faW50X2ZyZXEoYmMpOworCWRvIHsKKwkJc3dpdGNoIChpaXIgJiA2KSB7CisJCWNhc2UgNjoKKwkJCWluYihMU1IoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgNDoKKwkJCWluYihSQlIoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgMjoKKwkJCS8qCisJCQkgKiBjaGVjayBpZiB0cmFuc21pdHRlciBhY3RpdmUKKwkJCSAqLworCQkJaWYgKGhkbGNkcnZfcHR0KCZiYy0+aGRydikpCisJCQkJc2VyMTJfdHgoZGV2LCBiYyk7CisJCQllbHNlIHsKKwkJCQlzZXIxMl9yeChkZXYsIGJjKTsKKwkJCQliYy0+bW9kZW0uYXJiX2RpdmlkZXItLTsKKwkJCX0KKwkJCW91dGIoMHgwMCwgVEhSKGRldi0+YmFzZV9hZGRyKSk7CisJCQlicmVhazsKKwkJCQorCQlkZWZhdWx0OgorCQkJaW5iKE1TUihkZXYtPmJhc2VfYWRkcikpOworCQkJYnJlYWs7CisJCX0KKwkJaWlyID0gaW5iKElJUihkZXYtPmJhc2VfYWRkcikpOworCX0gd2hpbGUgKCEoaWlyICYgMSkpOworCWlmIChiYy0+bW9kZW0uYXJiX2RpdmlkZXIgPD0gMCkgeworCQliYy0+bW9kZW0uYXJiX2RpdmlkZXIgPSBTRVIxMl9BUkJfRElWSURFUihiYyk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJaGRsY2Rydl9hcmJpdHJhdGUoZGV2LCAmYmMtPmhkcnYpOworCX0KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaGRsY2Rydl90cmFuc21pdHRlcihkZXYsICZiYy0+aGRydik7CisJaGRsY2Rydl9yZWNlaXZlcihkZXYsICZiYy0+aGRydik7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtIHVhcnQgeyBjX3VhcnRfdW5rbm93biwgY191YXJ0XzgyNTAsCisJICAgIGNfdWFydF8xNjQ1MCwgY191YXJ0XzE2NTUwLCBjX3VhcnRfMTY1NTBBfTsKK3N0YXRpYyBjb25zdCBjaGFyICp1YXJ0X3N0cltdID0geyAKKwkidW5rbm93biIsICI4MjUwIiwgIjE2NDUwIiwgIjE2NTUwIiwgIjE2NTUwQSIgCit9OworCitzdGF0aWMgZW51bSB1YXJ0IHNlcjEyX2NoZWNrX3VhcnQodW5zaWduZWQgaW50IGlvYmFzZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGIxLGIyLGIzOworCWVudW0gdWFydCB1OworCWVudW0gdWFydCB1YXJ0X3RhYltdID0KKwkJeyBjX3VhcnRfMTY0NTAsIGNfdWFydF91bmtub3duLCBjX3VhcnRfMTY1NTAsIGNfdWFydF8xNjU1MEEgfTsKKworCWIxID0gaW5iKE1DUihpb2Jhc2UpKTsKKwlvdXRiKGIxIHwgMHgxMCwgTUNSKGlvYmFzZSkpOwkvKiBsb29wYmFjayBtb2RlICovCisJYjIgPSBpbmIoTVNSKGlvYmFzZSkpOworCW91dGIoMHgxYSwgTUNSKGlvYmFzZSkpOworCWIzID0gaW5iKE1TUihpb2Jhc2UpKSAmIDB4ZjA7CisJb3V0YihiMSwgTUNSKGlvYmFzZSkpOwkJCS8qIHJlc3RvcmUgb2xkIHZhbHVlcyAqLworCW91dGIoYjIsIE1TUihpb2Jhc2UpKTsKKwlpZiAoYjMgIT0gMHg5MCkKKwkJcmV0dXJuIGNfdWFydF91bmtub3duOworCWluYihSQlIoaW9iYXNlKSk7CisJaW5iKFJCUihpb2Jhc2UpKTsKKwlvdXRiKDB4MDEsIEZDUihpb2Jhc2UpKTsJCS8qIGVuYWJsZSBGSUZPcyAqLworCXUgPSB1YXJ0X3RhYlsoaW5iKElJUihpb2Jhc2UpKSA+PiA2KSAmIDNdOworCWlmICh1ID09IGNfdWFydF8xNjQ1MCkgeworCQlvdXRiKDB4NWEsIFNDUihpb2Jhc2UpKTsKKwkJYjEgPSBpbmIoU0NSKGlvYmFzZSkpOworCQlvdXRiKDB4YTUsIFNDUihpb2Jhc2UpKTsKKwkJYjIgPSBpbmIoU0NSKGlvYmFzZSkpOworCQlpZiAoKGIxICE9IDB4NWEpIHx8IChiMiAhPSAweGE1KSkKKwkJCXUgPSBjX3VhcnRfODI1MDsKKwl9CisJcmV0dXJuIHU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHNlcjEyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisJZW51bSB1YXJ0IHU7CisKKwlpZiAoIWRldiB8fCAhYmMpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFkZXYtPmJhc2VfYWRkciB8fCBkZXYtPmJhc2VfYWRkciA+IDB4MTAwMC1TRVIxMl9FWFRFTlQgfHwKKwkgICAgZGV2LT5pcnEgPCAyIHx8IGRldi0+aXJxID4gMTUpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU0VSMTJfRVhURU5ULCAiYmF5Y29tX3NlcjEyIikpCisJCXJldHVybiAtRUFDQ0VTOworCW1lbXNldCgmYmMtPm1vZGVtLCAwLCBzaXplb2YoYmMtPm1vZGVtKSk7CisJYmMtPmhkcnYucGFyLmJpdHJhdGUgPSAxMjAwOworCWlmICgodSA9IHNlcjEyX2NoZWNrX3VhcnQoZGV2LT5iYXNlX2FkZHIpKSA9PSBjX3VhcnRfdW5rbm93bikgeworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU0VSMTJfRVhURU5UKTsgICAgICAgCisJCXJldHVybiAtRUlPOworCX0KKwlvdXRiKDAsIEZDUihkZXYtPmJhc2VfYWRkcikpOyAgLyogZGlzYWJsZSBGSUZPcyAqLworCW91dGIoMHgwZCwgTUNSKGRldi0+YmFzZV9hZGRyKSk7CisJb3V0YigwLCBJRVIoZGV2LT5iYXNlX2FkZHIpKTsKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHNlcjEyX2ludGVycnVwdCwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisJCQkiYmF5Y29tX3NlcjEyIiwgZGV2KSkgeworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU0VSMTJfRVhURU5UKTsgICAgICAgCisJCXJldHVybiAtRUJVU1k7CisJfQorCS8qCisJICogZW5hYmxlIHRyYW5zbWl0dGVyIGVtcHR5IGludGVycnVwdAorCSAqLworCW91dGIoMiwgSUVSKGRldi0+YmFzZV9hZGRyKSk7CisJLyoKKwkgKiBzZXQgdGhlIFNJTyB0byA2IEJpdHMvY2hhcmFjdGVyIGFuZCAxOTIwMCBvciAyODgwMCBiYXVkLCBzbyB0aGF0CisJICogd2UgZ2V0IGV4YWN0bHkgKGhvcGVmdWxseSkgMiBvciAzIGludGVycnVwdHMgcGVyIHJhZGlvIHN5bWJvbCwKKwkgKiBkZXBlbmRpbmcgb24gdGhlIHVzYWdlIG9mIHRoZSBzb2Z0d2FyZSBEQ0Qgcm91dGluZQorCSAqLworCXNlcjEyX3NldF9kaXZpc29yKGRldiwgYmMtPm9wdF9kY2QgPyA2IDogNCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNlcjEyIGF0IGlvYmFzZSAweCVseCBpcnEgJXUgdWFydCAlc1xuIiwgCisJICAgICAgIGJjX2Rydm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgdWFydF9zdHJbdV0pOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzZXIxMl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghZGV2IHx8ICFiYykKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBkaXNhYmxlIGludGVycnVwdHMKKwkgKi8KKwlvdXRiKDAsIElFUihkZXYtPmJhc2VfYWRkcikpOworCW91dGIoMSwgTUNSKGRldi0+YmFzZV9hZGRyKSk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNFUjEyX0VYVEVOVCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNsb3NlIHNlcjEyIGF0IGlvYmFzZSAweCVseCBpcnEgJXVcbiIsCisJICAgICAgIGJjX2Rydm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PSBoZGxjZHJ2IGRyaXZlciBpbnRlcmZhY2UgPT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJheWNvbV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwKKwkJCXN0cnVjdCBoZGxjZHJ2X2lvY3RsICpoaSwgaW50IGNtZCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGhkbGNkcnZfb3BzIHNlcjEyX29wcyA9IHsKKwkuZHJ2bmFtZSA9IGJjX2Rydm5hbWUsCisJLmRydmluZm8gPSBiY19kcnZpbmZvLAorCS5vcGVuICAgID0gc2VyMTJfb3BlbiwKKwkuY2xvc2UgICA9IHNlcjEyX2Nsb3NlLAorCS5pb2N0bCAgID0gYmF5Y29tX2lvY3RsLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX3NldG1vZGUoc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMsIGNvbnN0IGNoYXIgKm1vZGVzdHIpCit7CisJaWYgKHN0cmNocihtb2Rlc3RyLCAnKicpKQorCQliYy0+b3B0X2RjZCA9IDA7CisJZWxzZSBpZiAoc3RyY2hyKG1vZGVzdHIsICcrJykpCisJCWJjLT5vcHRfZGNkID0gLTE7CisJZWxzZSBpZiAoc3RyY2hyKG1vZGVzdHIsICdAJykpCisJCWJjLT5vcHRfZGNkID0gLTI7CisJZWxzZQorCQliYy0+b3B0X2RjZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJheWNvbV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwKKwkJCXN0cnVjdCBoZGxjZHJ2X2lvY3RsICpoaSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYzsKKwlzdHJ1Y3QgYmF5Y29tX2lvY3RsIGJpOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCUJVR19PTihiYy0+aGRydi5tYWdpYyAhPSBIRExDRFJWX01BR0lDKTsKKworCWlmIChjbWQgIT0gU0lPQ0RFVlBSSVZBVEUpCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJc3dpdGNoIChoaS0+Y21kKSB7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisKKwljYXNlIEhETENEUlZDVExfR0VUTU9ERToKKwkJc3RyY3B5KGhpLT5kYXRhLm1vZGVuYW1lLCAic2VyMTIiKTsKKwkJaWYgKGJjLT5vcHRfZGNkIDw9IDApCisJCQlzdHJjYXQoaGktPmRhdGEubW9kZW5hbWUsICghYmMtPm9wdF9kY2QpID8gIioiIDogKGJjLT5vcHRfZGNkID09IC0yKSA/ICJAIiA6ICIrIik7CisJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgaGksIHNpemVvZihzdHJ1Y3QgaGRsY2Rydl9pb2N0bCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBIRExDRFJWQ1RMX1NFVE1PREU6CisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikgfHwgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJaGktPmRhdGEubW9kZW5hbWVbc2l6ZW9mKGhpLT5kYXRhLm1vZGVuYW1lKS0xXSA9ICdcMCc7CisJCXJldHVybiBiYXljb21fc2V0bW9kZShiYywgaGktPmRhdGEubW9kZW5hbWUpOworCisJY2FzZSBIRExDRFJWQ1RMX01PREVMSVNUOgorCQlzdHJjcHkoaGktPmRhdGEubW9kZW5hbWUsICJzZXIxMiIpOworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsIGhpLCBzaXplb2Yoc3RydWN0IGhkbGNkcnZfaW9jdGwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSERMQ0RSVkNUTF9NT0RFTVBBUk1BU0s6CisJCXJldHVybiBIRExDRFJWX1BBUk1BU0tfSU9CQVNFIHwgSERMQ0RSVl9QQVJNQVNLX0lSUTsKKworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmYmksIGlmci0+aWZyX2RhdGEsIHNpemVvZihiaSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzd2l0Y2ggKGJpLmNtZCkgeworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKyNpZmRlZiBCQVlDT01fREVCVUcKKwljYXNlIEJBWUNPTUNUTF9HRVRERUJVRzoKKwkJYmkuZGF0YS5kYmcuZGVidWcxID0gYmMtPmhkcnYucHR0X2tleWVkOworCQliaS5kYXRhLmRiZy5kZWJ1ZzIgPSBiYy0+ZGVidWdfdmFscy5sYXN0X2ludGNudDsKKwkJYmkuZGF0YS5kYmcuZGVidWczID0gYmMtPmRlYnVnX3ZhbHMubGFzdF9wbGxjb3JyOworCQlicmVhazsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KKworCX0KKwlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZiaSwgc2l6ZW9mKGJpKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogY29tbWFuZCBsaW5lIHNldHRhYmxlIHBhcmFtZXRlcnMKKyAqLworc3RhdGljIGNoYXIgKm1vZGVbTlJfUE9SVFNdID0geyAic2VyMTIqIiwgfTsKK3N0YXRpYyBpbnQgaW9iYXNlW05SX1BPUlRTXSA9IHsgMHgzZjgsIH07CitzdGF0aWMgaW50IGlycVtOUl9QT1JUU10gPSB7IDQsIH07CisKK21vZHVsZV9wYXJhbV9hcnJheShtb2RlLCBjaGFycCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGUsICJiYXljb20gb3BlcmF0aW5nIG1vZGU7ICogZm9yIHNvZnR3YXJlIERDRCIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvYmFzZSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW9iYXNlLCAiYmF5Y29tIGlvIGJhc2UgYWRkcmVzcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiYmF5Y29tIGlycSBudW1iZXIiKTsKKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIE0uIFNhaWxlciwgc2FpbGVyQGlmZS5lZS5ldGh6LmNoLCBoYjlqbnhAaGI5dy5jaGUuZXUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmF5Y29tIHNlcjEyIGhhbGYgZHVwbGV4IGFtYXRldXIgcmFkaW8gbW9kZW0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2JheWNvbXNlcmhkeCh2b2lkKQoreworCWludCBpLCBmb3VuZCA9IDA7CisJY2hhciBzZXRfaHcgPSAxOworCisJcHJpbnRrKGJjX2RydmluZm8pOworCS8qCisJICogcmVnaXN0ZXIgbmV0IGRldmljZXMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYzsKKwkJY2hhciBpZm5hbWVbSUZOQU1TSVpdOworCisJCXNwcmludGYoaWZuYW1lLCAiYmNzaCVkIiwgaSk7CisKKwkJaWYgKCFtb2RlW2ldKQorCQkJc2V0X2h3ID0gMDsKKwkJaWYgKCFzZXRfaHcpCisJCQlpb2Jhc2VbaV0gPSBpcnFbaV0gPSAwOworCisJCWRldiA9IGhkbGNkcnZfcmVnaXN0ZXIoJnNlcjEyX29wcywgCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmF5Y29tX3N0YXRlKSwKKwkJCQkgICAgICAgaWZuYW1lLCBpb2Jhc2VbaV0sIGlycVtpXSwgMCk7CisJCWlmIChJU19FUlIoZGV2KSkgCisJCQlicmVhazsKKworCQliYyA9IG5ldGRldl9wcml2KGRldik7CisJCWlmIChzZXRfaHcgJiYgYmF5Y29tX3NldG1vZGUoYmMsIG1vZGVbaV0pKQorCQkJc2V0X2h3ID0gMDsKKwkJZm91bmQrKzsKKwkJYmF5Y29tX2RldmljZVtpXSA9IGRldjsKKwl9CisKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gLUVOWElPOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9iYXljb21zZXJoZHgodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJheWNvbV9kZXZpY2VbaV07CisKKwkJaWYgKGRldikKKwkJCWhkbGNkcnZfdW5yZWdpc3RlcihkZXYpOworCX0KK30KKworbW9kdWxlX2luaXQoaW5pdF9iYXljb21zZXJoZHgpOworbW9kdWxlX2V4aXQoY2xlYW51cF9iYXljb21zZXJoZHgpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBNT0RVTEUKKworLyoKKyAqIGZvcm1hdDogYmF5Y29tX3Nlcl9oZHg9aW8saXJxLG1vZGUKKyAqIG1vZGU6IHNlcjEyICAgIGhhcmR3YXJlIERDRAorICogICAgICAgc2VyMTIqICAgc29mdHdhcmUgRENECisgKiAgICAgICBzZXIxMkAgICBoYXJkd2FyZS9zb2Z0d2FyZSBEQ0QsIGkuZS4gbm8gZXhwbGljaXQgRENEIHNpZ25hbCBidXQgaGFyZHdhcmUKKyAqICAgICAgICAgICAgICAgIG11dGVzIGF1ZGlvIGlucHV0IHRvIHRoZSBtb2RlbQorICogICAgICAgc2VyMTIrICAgaGFyZHdhcmUgRENELCBpbnZlcnRlZCBzaWduYWwgYXQgRENEIHBpbgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGJheWNvbV9zZXJfaGR4X3NldHVwKGNoYXIgKnN0cikKK3sKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIG5yX2RldjsKKwlpbnQgaW50c1szXTsKKworICAgICAgICBpZiAobnJfZGV2ID49IE5SX1BPUlRTKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgMywgaW50cyk7CisJaWYgKGludHNbMF0gPCAyKQorCQlyZXR1cm4gMDsKKwltb2RlW25yX2Rldl0gPSBzdHI7CisJaW9iYXNlW25yX2Rldl0gPSBpbnRzWzFdOworCWlycVtucl9kZXZdID0gaW50c1syXTsKKwlucl9kZXYrKzsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYmF5Y29tX3Nlcl9oZHg9IiwgYmF5Y29tX3Nlcl9oZHhfc2V0dXApOworCisjZW5kaWYgLyogTU9EVUxFICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JwcWV0aGVyLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9icHFldGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMWEzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9icHFldGhlci5jCkBAIC0wLDAgKzEsNjQzIEBACisvKgorICoJRzhCUFEgY29tcGF0aWJsZSAiQVguMjUgdmlhIGV0aGVybmV0IiBkcml2ZXIgcmVsZWFzZSAwMDQKKyAqCisgKglUaGlzIGNvZGUgUkVRVUlSRVMgMi4wLjAgb3IgaGlnaGVyLyBORVQzLjAyOQorICoKKyAqCVRoaXMgbW9kdWxlOgorICoJCVRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGlzIGEgInBzZXVkbyIgbmV0d29yayBkcml2ZXIgdG8gYWxsb3cgQVguMjUgb3ZlciBFdGhlcm5ldAorICoJdXNpbmcgRzhCUFEgZW5jYXBzdWxhdGlvbi4gSXQgaGFzIGJlZW4gZXh0cmFjdGVkIGZyb20gdGhlIHByb3RvY29sCisgKglpbXBsZW1lbnRhdGlvbiBiZWNhdXNlCisgKgorICoJCS0gdGhpbmdzIGdvdCB1bnJlYWRhYmxlIHdpdGhpbiB0aGUgcHJvdG9jb2wgc3RhY2sKKyAqCQktIHRvIGN1cmUgdGhlIHByb3RvY29sIHN0YWNrIGZyb20gImZlYXR1cmUtaXNtIgorICoJCS0gYSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBzaG91bGRuJ3QgbmVlZCB0byBrbm93IG9uCisgKgkJICB3aGljaCBoYXJkd2FyZSBpdCBpcyBydW5uaW5nCisgKgkJLSB1c2VyLWxldmVsIHByb2dyYW1zIGxpa2UgdGhlIEFYLjI1IHV0aWxpdGllcyBzaG91bGRuJ3QKKyAqCQkgIG5lZWQgdG8ga25vdyBhYm91dCB0aGUgaGFyZHdhcmUuCisgKgkJLSBJUCBvdmVyIGV0aGVybmV0IGVuY2Fwc3VsYXRlZCBBWC4yNSB3YXMgaW1wb3NzaWJsZQorICoJCS0gcnhlY2hvLmMgZGlkIG5vdCB3b3JrCisgKgkJLSB0byBoYXZlIHJvb20gZm9yIGV4dGVuc2lvbnMKKyAqCQktIGl0IGp1c3QgZGVzZXJ2ZXMgdG8gImxpdmUiIGFzIGFuIG93biBkcml2ZXIKKyAqCisgKglUaGlzIGRyaXZlciBjYW4gdXNlIGFueSBldGhlcm5ldCBkZXN0aW5hdGlvbiBhZGRyZXNzLCBhbmQgY2FuIGJlCisgKglsaW1pdGVkIHRvIGFjY2VwdCBmcmFtZXMgZnJvbSBvbmUgZGVkaWNhdGVkIGV0aGVybmV0IGNhcmQgb25seS4KKyAqCisgKglOb3RlIHRoYXQgdGhlIGRyaXZlciBzZXRzIHVwIHRoZSBCUFEgZGV2aWNlcyBhdXRvbWFnaWNhbGx5IG9uCisgKglzdGFydHVwIG9yIChpZiBzdGFydGVkIGJlZm9yZSB0aGUgImluc21vZCIgb2YgYW4gZXRoZXJuZXQgZGV2aWNlKQorICoJb24gImlmY29uZmlnIHVwIi4gSXQgaG9wZWZ1bGx5IHdpbGwgcmVtb3ZlIHRoZSBCUFEgb24gInJtbW9kImluZworICoJdGhlIGV0aGVybmV0IGRldmljZSAoaW4gZmFjdDogYXMgc29vbiBhcyBhbm90aGVyIGV0aGVybmV0IG9yIGJwcQorICoJZGV2aWNlIGdldHMgImlmY29uZmlnInVyZWQpLgorICoKKyAqCUkgaGF2ZSBoZWFyZCB0aGF0IHNldmVyYWwgcGVvcGxlIGFyZSB0aGlua2luZyBvZiBleHBlcmltZW50cworICoJd2l0aCBoaWdoc3BlZWQgcGFja2V0IHJhZGlvIHVzaW5nIGV4aXN0aW5nIGV0aGVybmV0IGNhcmRzLgorICoJV2VsbCwgdGhpcyBkcml2ZXIgaXMgcHJlcGFyZWQgZm9yIHRoaXMgcHVycG9zZSwganVzdCBhZGQKKyAqCXlvdXIgdHgga2V5IGNvbnRyb2wgYW5kIGEgdHhkZWxheSAvIHRhaWx0aW1lIGFsZ29yaXRobSwKKyAqCXByb2JhYmx5IHNvbWUgYnVmZmVyaW5nLCBhbmQgL3ZvaWxhLy4uLgorICoKKyAqCUhpc3RvcnkKKyAqCUJQUSAgIDAwMQlKb2VyZyhETDFCS0UpCQlFeHRyYWN0ZWQgQlBRIGNvZGUgZnJvbSBBWC4yNQorICoJCQkJCQlwcm90b2NvbCBzdGFjayBhbmQgYWRkZWQgbXkgb3duCisgKgkJCQkJCXlldCBleGlzdGluZyBwYXRjaGVzCisgKglCUFEgICAwMDIJSm9lcmcoREwxQktFKQkJU2NhbiBuZXR3b3JrIGRldmljZSBsaXN0IG9uCisgKgkJCQkJCXN0YXJ0dXAuCisgKglCUFEgICAwMDMJSm9lcmcoREwxQktFKQkJRXRoZXJuZXQgZGVzdGluYXRpb24gYWRkcmVzcworICoJCQkJCQlhbmQgYWNjZXB0ZWQgc291cmNlIGFkZHJlc3MKKyAqCQkJCQkJY2FuIGJlIGNvbmZpZ3VyZWQgYnkgYW4gaW9jdGwoKQorICoJCQkJCQljYWxsLgorICoJCQkJCQlGaXhlZCB0byBtYXRjaCBMaW51eCBuZXR3b3JraW5nCisgKgkJCQkJCWNoYW5nZXMgLSAyLjEuMTUuCisgKglCUFEgICAwMDQJSm9lcmcoREwxQktFKQkJRml4ZWQgdG8gbm90IGxvY2sgdXAgb24gaWZjb25maWcuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKworI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworI2luY2x1ZGUgPGxpbnV4L2JwcWV0aGVyLmg+CisKK3N0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPSBLRVJOX0lORk8gIkFYLjI1OiBicHFldGhlciBkcml2ZXIgdmVyc2lvbiAwMDRcbiI7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF4MjVfYmNhc3RbQVgyNV9BRERSX0xFTl0gPQorCXsnUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnMCcgPDwgMX07CitzdGF0aWMgdW5zaWduZWQgY2hhciBheDI1X2RlZmFkZHJbQVgyNV9BRERSX0xFTl0gPQorCXsnTCcgPDwgMSwgJ0knIDw8IDEsICdOJyA8PCAxLCAnVScgPDwgMSwgJ1gnIDw8IDEsICcgJyA8PCAxLCAnMScgPDwgMX07CisKK3N0YXRpYyBjaGFyIGJjYXN0X2FkZHJbNl09ezB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGfTsKKworc3RhdGljIGNoYXIgYnBxX2V0aF9hZGRyWzZdOworCitzdGF0aWMgaW50IGJwcV9yY3Yoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHBhY2tldF90eXBlICopOworc3RhdGljIGludCBicHFfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOworc3RhdGljIGNvbnN0IGNoYXIgKmJwcV9wcmludF9ldGhhZGRyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKik7CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgYnBxX3BhY2tldF90eXBlID0geworCS50eXBlCT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9CUFEpLAorCS5mdW5jCT0gYnBxX3JjdiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYnBxX2Rldl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9YnBxX2RldmljZV9ldmVudCwKK307CisKKworc3RydWN0IGJwcWRldiB7CisJc3RydWN0IGxpc3RfaGVhZCBicHFfbGlzdDsJLyogbGlzdCBvZiBicHEgZGV2aWNlcyBjaGFpbiAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpldGhkZXY7CS8qIGxpbmsgdG8gZXRoZXJuZXQgZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmF4ZGV2OwkvKiBicHEgZGV2aWNlIChicHEjKSAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBzb21lIHN0YXRpc3RpY3MgKi8KKwljaGFyICAgZGVzdF9hZGRyWzZdOwkJLyogZXRoZXIgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCWNoYXIgICBhY3B0X2FkZHJbNl07CQkvKiBhY2NlcHQgZXRoZXIgZnJhbWVzIGZyb20gdGhpcyBhZGRyZXNzIG9ubHkgKi8KK307CisKK3N0YXRpYyBMSVNUX0hFQUQoYnBxX2RldmljZXMpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qCisgKglHZXQgdGhlIGV0aGVybmV0IGRldmljZSBmb3IgYSBCUFEgZGV2aWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKmJwcV9nZXRfZXRoZXJfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJwcWRldiAqYnBxID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiBicHEgPyBicHEtPmV0aGRldiA6IE5VTEw7Cit9CisKKy8qCisgKglHZXQgdGhlIEJQUSBkZXZpY2UgZm9yIHRoZSBldGhlcm5ldCBkZXZpY2UKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqYnBxX2dldF9heDI1X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBicHFkZXYgKmJwcTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnBxLCAmYnBxX2RldmljZXMsIGJwcV9saXN0KSB7CisJCWlmIChicHEtPmV0aGRldiA9PSBkZXYpCisJCQlyZXR1cm4gYnBxLT5heGRldjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRldl9pc19ldGhkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKAorCQkJZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUgorCQkJJiYgc3RybmNtcChkZXYtPm5hbWUsICJkdW1teSIsIDUpCisJKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyoKKyAqCVJlY2VpdmUgYW4gQVguMjUgZnJhbWUgdmlhIGFuIGV0aGVybmV0IGludGVyZmFjZS4KKyAqLworc3RhdGljIGludCBicHFfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHR5cGUpCit7CisJaW50IGxlbjsKKwljaGFyICogcHRyOworCXN0cnVjdCBldGhoZHIgKmV0aDsKKwlzdHJ1Y3QgYnBxZGV2ICpicHE7CisKKwlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gTkVUX1JYX0RST1A7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGV0aGhkcikpKQorCQlnb3RvIGRyb3A7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZGV2ID0gYnBxX2dldF9heDI1X2RldihkZXYpOworCisJaWYgKGRldiA9PSBOVUxMIHx8ICFuZXRpZl9ydW5uaW5nKGRldikpIAorCQlnb3RvIGRyb3BfdW5sb2NrOworCisJLyoKKwkgKiBpZiB3ZSB3YW50IHRvIGFjY2VwdCBmcmFtZXMgZnJvbSBqdXN0IG9uZSBldGhlcm5ldCBkZXZpY2UKKwkgKiB3ZSBjaGVjayB0aGUgc291cmNlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci4KKwkgKi8KKworCWJwcSA9IG5ldGRldl9wcml2KGRldik7CisKKwlldGggPSBldGhfaGRyKHNrYik7CisKKwlpZiAoIShicHEtPmFjcHRfYWRkclswXSAmIDB4MDEpICYmCisJICAgIG1lbWNtcChldGgtPmhfc291cmNlLCBicHEtPmFjcHRfYWRkciwgRVRIX0FMRU4pKQorCQlnb3RvIGRyb3BfdW5sb2NrOworCisJaWYgKHNrYl9jb3coc2tiLCBzaXplb2Yoc3RydWN0IGV0aGhkcikpKQorCQlnb3RvIGRyb3BfdW5sb2NrOworCisJbGVuID0gc2tiLT5kYXRhWzBdICsgc2tiLT5kYXRhWzFdICogMjU2IC0gNTsKKworCXNrYl9wdWxsKHNrYiwgMik7CS8qIFJlbW92ZSB0aGUgbGVuZ3RoIGJ5dGVzICovCisJc2tiX3RyaW0oc2tiLCBsZW4pOwkvKiBTZXQgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSAqLworCisJYnBxLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJYnBxLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKwlwdHIgPSBza2JfcHVzaChza2IsIDEpOworCSpwdHIgPSAwOworCisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FYMjUpOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Cit1bmxvY2s6CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiAwOworZHJvcF91bmxvY2s6CisJa2ZyZWVfc2tiKHNrYik7CisJZ290byB1bmxvY2s7CisKK2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAJU2VuZCBhbiBBWC4yNSBmcmFtZSB2aWEgYW4gZXRoZXJuZXQgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbnQgYnBxX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwlzdHJ1Y3QgYnBxZGV2ICpicHE7CisJaW50IHNpemU7CisKKwkvKgorCSAqIEp1c3QgdG8gYmUgKnJlYWxseSogc3VyZSBub3QgdG8gc2VuZCBhbnl0aGluZyBpZiB0aGUgaW50ZXJmYWNlCisJICogaXMgZG93biwgdGhlIGV0aGVybmV0IGRldmljZSBtYXkgaGF2ZSBnb25lLgorCSAqLworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlza2JfcHVsbChza2IsIDEpOworCXNpemUgPSBza2ItPmxlbjsKKworCS8qCisJICogVGhlIEFYLjI1IGNvZGUgbGVhdmVzIGVub3VnaCByb29tIGZvciB0aGUgZXRoZXJuZXQgaGVhZGVyLCBidXQKKwkgKiBzZW5kdG8oKSBkb2VzIG5vdC4KKwkgKi8KKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBBWDI1X0JQUV9IRUFERVJfTEVOKSB7CS8qIE91Z2ghICovCisJCWlmICgobmV3c2tiID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBBWDI1X0JQUV9IRUFERVJfTEVOKSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnBxZXRoZXI6IG91dCBvZiBtZW1vcnlcbiIpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWlmIChza2ItPnNrICE9IE5VTEwpCisJCQlza2Jfc2V0X293bmVyX3cobmV3c2tiLCBza2ItPnNrKTsKKworCQlrZnJlZV9za2Ioc2tiKTsKKwkJc2tiID0gbmV3c2tiOworCX0KKworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BWDI1KTsKKworCXB0ciA9IHNrYl9wdXNoKHNrYiwgMik7CisKKwkqcHRyKysgPSAoc2l6ZSArIDUpICUgMjU2OworCSpwdHIrKyA9IChzaXplICsgNSkgLyAyNTY7CisKKwlicHEgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKChkZXYgPSBicHFfZ2V0X2V0aGVyX2RldihkZXYpKSA9PSBOVUxMKSB7CisJCWJwcS0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgRVRIX1BfQlBRLCBicHEtPmRlc3RfYWRkciwgTlVMTCwgMCk7CisJYnBxLT5zdGF0cy50eF9wYWNrZXRzKys7CisJYnBxLT5zdGF0cy50eF9ieXRlcys9c2tiLT5sZW47CisgIAorCWRldl9xdWV1ZV94bWl0KHNrYik7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKgorICoJU3RhdGlzdGljcworICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJwcV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYnBxZGV2ICpicHEgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZicHEtPnN0YXRzOworfQorCisvKgorICoJU2V0IEFYLjI1IGNhbGxzaWduCisgKi8KK3N0YXRpYyBpbnQgYnBxX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworICAgIHN0cnVjdCBzb2NrYWRkciAqc2EgPSAoc3RydWN0IHNvY2thZGRyICopYWRkcjsKKworICAgIG1lbWNweShkZXYtPmRldl9hZGRyLCBzYS0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoJSW9jdGwgY29tbWFuZHMKKyAqCisgKgkJU0lPQ1NCUFFFVEhPUFQJCXJlc2VydmVkIGZvciBlbmhhbmNlbWVudHMKKyAqCQlTSU9DU0JQUUVUSEFERFIJCXNldCB0aGUgZGVzdGluYXRpb24gYW5kIGFjY2VwdGVkCisgKgkJCQkJc291cmNlIGV0aGVybmV0IGFkZHJlc3MgKGJyb2FkY2FzdAorICoJCQkJCW9yIG11bHRpY2FzdDogYWNjZXB0IGFsbCkKKyAqLworc3RhdGljIGludCBicHFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IGJwcV9ldGhhZGRyIF9fdXNlciAqZXRoYWRkciA9IGlmci0+aWZyX2RhdGE7CisJc3RydWN0IGJwcWRldiAqYnBxID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYnBxX3JlcSByZXE7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFNJT0NTQlBRRVRIT1BUOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEsIGlmci0+aWZyX2RhdGEsIHNpemVvZihzdHJ1Y3QgYnBxX3JlcSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc3dpdGNoIChyZXEuY21kKSB7CisJCQkJY2FzZSBTSU9DR0JQUUVUSFBBUkFNOgorCQkJCWNhc2UgU0lPQ1NCUFFFVEhQQVJBTToKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBTSU9DU0JQUUVUSEFERFI6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoYnBxLT5kZXN0X2FkZHIsIGV0aGFkZHItPmRlc3RpbmF0aW9uLCBFVEhfQUxFTikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoYnBxLT5hY3B0X2FkZHIsIGV0aGFkZHItPmFjY2VwdCwgRVRIX0FMRU4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogb3Blbi9jbG9zZSBhIGRldmljZQorICovCitzdGF0aWMgaW50IGJwcV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicHFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyoKKyAqCVByb2MgZmlsZXN5c3RlbQorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGJwcV9wcmludF9ldGhhZGRyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmUpCit7CisJc3RhdGljIGNoYXIgYnVmWzE4XTsKKworCXNwcmludGYoYnVmLCAiJTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlgiLAorCQllWzBdLCBlWzFdLCBlWzJdLCBlWzNdLCBlWzRdLCBlWzVdKTsKKworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkICpicHFfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlpbnQgaSA9IDE7CisJc3RydWN0IGJwcWRldiAqYnBxZGV2OworCisJcmN1X3JlYWRfbG9jaygpOworCisJaWYgKCpwb3MgPT0gMCkKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKwkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJwcWRldiwgJmJwcV9kZXZpY2VzLCBicHFfbGlzdCkgeworCQlpZiAoaSA9PSAqcG9zKQorCQkJcmV0dXJuIGJwcWRldjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpicHFfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwkrKypwb3M7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXAgPSBicHFfZGV2aWNlcy5uZXh0OworCWVsc2UKKwkJcCA9ICgoc3RydWN0IGJwcWRldiAqKXYpLT5icHFfbGlzdC5uZXh0OworCisJcmV0dXJuIChwID09ICZicHFfZGV2aWNlcykgPyBOVUxMIAorCQk6IGxpc3RfZW50cnkocCwgc3RydWN0IGJwcWRldiwgYnBxX2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBicHFfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKKworc3RhdGljIGludCBicHFfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHV0cyhzZXEsIAorCQkJICJkZXYgICBldGhlciAgICAgIGRlc3RpbmF0aW9uICAgICAgICBhY2NlcHQgZnJvbVxuIik7CisJZWxzZSB7CisJCWNvbnN0IHN0cnVjdCBicHFkZXYgKmJwcWRldiA9IHY7CisKKwkJc2VxX3ByaW50ZihzZXEsICIlLTVzICUtMTBzICVzICAiLAorCQkJYnBxZGV2LT5heGRldi0+bmFtZSwgYnBxZGV2LT5ldGhkZXYtPm5hbWUsCisJCQlicHFfcHJpbnRfZXRoYWRkcihicHFkZXYtPmRlc3RfYWRkcikpOworCisJCXNlcV9wcmludGYoc2VxLCAiJXNcbiIsCisJCQkoYnBxZGV2LT5hY3B0X2FkZHJbMF0gJiAweDAxKSA/ICIqIiAKKwkJCSAgIDogYnBxX3ByaW50X2V0aGFkZHIoYnBxZGV2LT5hY3B0X2FkZHIpKTsKKworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBicHFfc2Vxb3BzID0geworCS5zdGFydCA9IGJwcV9zZXFfc3RhcnQsCisJLm5leHQgPSBicHFfc2VxX25leHQsCisJLnN0b3AgPSBicHFfc2VxX3N0b3AsCisJLnNob3cgPSBicHFfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGJwcV9pbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZicHFfc2Vxb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYnBxX2luZm9fZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGJwcV9pbmZvX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKK3N0YXRpYyB2b2lkIGJwcV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBicHFfeG1pdDsKKwlkZXYtPm9wZW4JICAgICA9IGJwcV9vcGVuOworCWRldi0+c3RvcAkgICAgID0gYnBxX2Nsb3NlOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gYnBxX3NldF9tYWNfYWRkcmVzczsKKwlkZXYtPmdldF9zdGF0cwkgICAgID0gYnBxX2dldF9zdGF0czsKKwlkZXYtPmRvX2lvY3RsCSAgICAgPSBicHFfaW9jdGw7CisJZGV2LT5kZXN0cnVjdG9yCSAgICAgPSBmcmVlX25ldGRldjsKKworCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgYXgyNV9iY2FzdCwgQVgyNV9BRERSX0xFTik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICBheDI1X2RlZmFkZHIsIEFYMjVfQUREUl9MRU4pOworCisJZGV2LT5mbGFncyAgICAgID0gMDsKKworI2lmIGRlZmluZWQoQ09ORklHX0FYMjUpIHx8IGRlZmluZWQoQ09ORklHX0FYMjVfTU9EVUxFKQorCWRldi0+aGFyZF9oZWFkZXIgICAgID0gYXgyNV9lbmNhcHN1bGF0ZTsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyICA9IGF4MjVfcmVidWlsZF9oZWFkZXI7CisjZW5kaWYKKworCWRldi0+dHlwZSAgICAgICAgICAgID0gQVJQSFJEX0FYMjU7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBBWDI1X01BWF9IRUFERVJfTEVOICsgQVgyNV9CUFFfSEVBREVSX0xFTjsKKwlkZXYtPm10dSAgICAgICAgICAgICA9IEFYMjVfREVGX1BBQ0xFTjsKKwlkZXYtPmFkZHJfbGVuICAgICAgICA9IEFYMjVfQUREUl9MRU47CisKK30KKworLyoKKyAqCVNldHVwIGEgbmV3IGRldmljZS4KKyAqLworc3RhdGljIGludCBicHFfbmV3X2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZWRldikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBicHFkZXYgKmJwcTsKKworCW5kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBicHFkZXYpLCAiYnBxJWQiLAorCQkJICAgYnBxX3NldHVwKTsKKwlpZiAoIW5kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJCQorCWJwcSA9IG5ldGRldl9wcml2KG5kZXYpOworCWRldl9ob2xkKGVkZXYpOworCWJwcS0+ZXRoZGV2ID0gZWRldjsKKwlicHEtPmF4ZGV2ID0gbmRldjsKKworCW1lbWNweShicHEtPmRlc3RfYWRkciwgYmNhc3RfYWRkciwgc2l6ZW9mKGJwcV9ldGhfYWRkcikpOworCW1lbWNweShicHEtPmFjcHRfYWRkciwgYmNhc3RfYWRkciwgc2l6ZW9mKGJwcV9ldGhfYWRkcikpOworCisJZXJyID0gZGV2X2FsbG9jX25hbWUobmRldiwgbmRldi0+bmFtZSk7CisJaWYgKGVyciA8IDApIAorCQlnb3RvIGVycm9yOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKG5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBMaXN0IHByb3RlY3RlZCBieSBSVE5MICovCisJbGlzdF9hZGRfcmN1KCZicHEtPmJwcV9saXN0LCAmYnBxX2RldmljZXMpOworCXJldHVybiAwOworCisgZXJyb3I6CisJZGV2X3B1dChlZGV2KTsKKwlmcmVlX25ldGRldihuZGV2KTsKKwlyZXR1cm4gZXJyOworCQorfQorCitzdGF0aWMgdm9pZCBicHFfZnJlZV9kZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IGJwcWRldiAqYnBxID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlkZXZfcHV0KGJwcS0+ZXRoZGV2KTsKKwlsaXN0X2RlbF9yY3UoJmJwcS0+YnBxX2xpc3QpOworCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2UobmRldik7Cit9CisKKy8qCisgKglIYW5kbGUgZGV2aWNlIHN0YXR1cyBjaGFuZ2VzLgorICovCitzdGF0aWMgaW50IGJwcV9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcHRyOworCisJaWYgKCFkZXZfaXNfZXRoZGV2KGRldikpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5FVERFVl9VUDoJCS8qIG5ldyBldGhlcm5ldCBkZXZpY2UgLT4gbmV3IEJQUSBpbnRlcmZhY2UgKi8KKwkJaWYgKGJwcV9nZXRfYXgyNV9kZXYoZGV2KSA9PSBOVUxMKQorCQkJYnBxX25ld19kZXZpY2UoZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIE5FVERFVl9ET1dOOgkvKiBldGhlcm5ldCBkZXZpY2UgY2xvc2VkIC0+IGNsb3NlIEJQUSBpbnRlcmZhY2UgKi8KKwkJaWYgKChkZXYgPSBicHFfZ2V0X2F4MjVfZGV2KGRldikpICE9IE5VTEwpCisJCQlkZXZfY2xvc2UoZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgkvKiBldGhlcm5ldCBkZXZpY2UgcmVtb3ZlZCAtPiBmcmVlIEJQUSBpbnRlcmZhY2UgKi8KKwkJaWYgKChkZXYgPSBicHFfZ2V0X2F4MjVfZGV2KGRldikpICE9IE5VTEwpCisJCQlicHFfZnJlZV9kZXZpY2UoZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogSW5pdGlhbGl6ZSBkcml2ZXIuIFRvIGJlIGNhbGxlZCBmcm9tIGFmX2F4MjUgaWYgbm90IGNvbXBpbGVkIGFzIGEKKyAqIG1vZHVsZQorICovCitzdGF0aWMgaW50IF9faW5pdCBicHFfaW5pdF9kcml2ZXIodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoImJwcWV0aGVyIiwgU19JUlVHTywgJmJwcV9pbmZvX2ZvcHMpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImJwcTogY2Fubm90IGNyZWF0ZSAvcHJvYy9uZXQvYnBxZXRoZXIgZW50cnkuXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorI2VuZGlmICAvKiBDT05GSUdfUFJPQ19GUyAqLworCisJZGV2X2FkZF9wYWNrKCZicHFfcGFja2V0X3R5cGUpOworCisJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZicHFfZGV2X25vdGlmaWVyKTsKKworCXByaW50ayhiYW5uZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBicHFfY2xlYW51cF9kcml2ZXIodm9pZCkKK3sKKwlzdHJ1Y3QgYnBxZGV2ICpicHE7CisKKwlkZXZfcmVtb3ZlX3BhY2soJmJwcV9wYWNrZXRfdHlwZSk7CisKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmYnBxX2Rldl9ub3RpZmllcik7CisKKwlwcm9jX25ldF9yZW1vdmUoImJwcWV0aGVyIik7CisKKwlydG5sX2xvY2soKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmJwcV9kZXZpY2VzKSkgeworCQlicHEgPSBsaXN0X2VudHJ5KGJwcV9kZXZpY2VzLm5leHQsIHN0cnVjdCBicHFkZXYsIGJwcV9saXN0KTsKKwkJYnBxX2ZyZWVfZGV2aWNlKGJwcS0+YXhkZXYpOworCX0KKwlydG5sX3VubG9jaygpOworfQorCitNT0RVTEVfQVVUSE9SKCJKb2VyZyBSZXV0ZXIgREwxQktFIDxqcmV1dGVyQHlhaW5hLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUcmFuc21pdCBhbmQgcmVjZWl2ZSBBWC4yNSBwYWNrZXRzIG92ZXIgRXRoZXJuZXQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGJwcV9pbml0X2RyaXZlcik7Cittb2R1bGVfZXhpdChicHFfY2xlYW51cF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vZG1hc2NjLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9kbWFzY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzI2OWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vZG1hc2NjLmMKQEAgLTAsMCArMSwxNDkzIEBACisvKgorICogRHJpdmVyIGZvciBoaWdoLXNwZWVkIFNDQyBib2FyZHMgKHRob3NlIHdpdGggRE1BIHN1cHBvcnQpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCBLbGF1cyBLdWRpZWxrYQorICoKKyAqIFM1U0NDL0RNQSBzdXBwb3J0IGJ5IEphbmtvIEtvbGV6bmlrIFM1MkhJCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSAiejg1MzAuaCIKKworCisvKiBOdW1iZXIgb2YgYnVmZmVycyBwZXIgY2hhbm5lbCAqLworCisjZGVmaW5lIE5VTV9UWF9CVUYgICAgICAyCS8qIE5VTV9UWF9CVUYgPj0gMSAobWluLiAyIHJlY29tbWVuZGVkKSAqLworI2RlZmluZSBOVU1fUlhfQlVGICAgICAgNgkvKiBOVU1fUlhfQlVGID49IDEgKG1pbi4gMiByZWNvbW1lbmRlZCkgKi8KKyNkZWZpbmUgQlVGX1NJWkUgICAgICAgIDE1NzYJLyogQlVGX1NJWkUgPj0gbXR1ICsgaGFyZF9oZWFkZXJfbGVuICovCisKKworLyogQ2FyZHMgc3VwcG9ydGVkICovCisKKyNkZWZpbmUgSFdfUEkgICAgICAgICAgIHsgIk90dGF3YSBQSSIsIDB4MzAwLCAweDIwLCAweDEwLCA4LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgOCwgMTg0MzIwMCwgMzY4NjQwMCB9CisjZGVmaW5lIEhXX1BJMiAgICAgICAgICB7ICJPdHRhd2EgUEkyIiwgMHgzMDAsIDB4MjAsIDB4MTAsIDgsIFwKKwkJCSAgICAwLCA4LCAzNjg2NDAwLCA3MzcyODAwIH0KKyNkZWZpbmUgSFdfVFdJTiAgICAgICAgIHsgIkdyYWNpbGlzIFBhY2tlVHdpbiIsIDB4MjAwLCAweDEwLCAweDEwLCAzMiwgXAorCQkJICAgIDAsIDQsIDYxNDQwMDAsIDYxNDQwMDAgfQorI2RlZmluZSBIV19TNSAgICAgICAgICAgeyAiUzVTQ0MvRE1BIiwgMHgyMDAsIDB4MTAsIDB4MTAsIDMyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDgsIDQ5MTUyMDAsIDk4MzA0MDAgfQorCisjZGVmaW5lIEhBUkRXQVJFICAgICAgICB7IEhXX1BJLCBIV19QSTIsIEhXX1RXSU4sIEhXX1M1IH0KKworI2RlZmluZSBUTVJfMF9IWiAgICAgICAgMjU2MDAJLyogRnJlcXVlbmN5IG9mIHRpbWVyIDAgKi8KKworI2RlZmluZSBUWVBFX1BJICAgICAgICAgMAorI2RlZmluZSBUWVBFX1BJMiAgICAgICAgMQorI2RlZmluZSBUWVBFX1RXSU4gICAgICAgMgorI2RlZmluZSBUWVBFX1M1ICAgICAgICAgMworI2RlZmluZSBOVU1fVFlQRVMgICAgICAgNAorCisjZGVmaW5lIE1BWF9OVU1fREVWUyAgICAzMgorCisKKy8qIFNDQyBjaGlwcyBzdXBwb3J0ZWQgKi8KKworI2RlZmluZSBaODUzMCAgICAgICAgICAgMAorI2RlZmluZSBaODVDMzAgICAgICAgICAgMQorI2RlZmluZSBaODUyMzAgICAgICAgICAgMgorCisjZGVmaW5lIENISVBOQU1FUyAgICAgICB7ICJaODUzMCIsICJaODVDMzAiLCAiWjg1MjMwIiB9CisKKworLyogSS9PIHJlZ2lzdGVycyAqLworCisvKiA4NTMwIHJlZ2lzdGVycyByZWxhdGl2ZSB0byBjYXJkIGJhc2UgKi8KKyNkZWZpbmUgU0NDQl9DTUQgICAgICAgIDB4MDAKKyNkZWZpbmUgU0NDQl9EQVRBICAgICAgIDB4MDEKKyNkZWZpbmUgU0NDQV9DTUQgICAgICAgIDB4MDIKKyNkZWZpbmUgU0NDQV9EQVRBICAgICAgIDB4MDMKKworLyogODI1My84MjU0IHJlZ2lzdGVycyByZWxhdGl2ZSB0byBjYXJkIGJhc2UgKi8KKyNkZWZpbmUgVE1SX0NOVDAgICAgICAgIDB4MDAKKyNkZWZpbmUgVE1SX0NOVDEgICAgICAgIDB4MDEKKyNkZWZpbmUgVE1SX0NOVDIgICAgICAgIDB4MDIKKyNkZWZpbmUgVE1SX0NUUkwgICAgICAgIDB4MDMKKworLyogQWRkaXRpb25hbCBQSS9QSTIgcmVnaXN0ZXJzIHJlbGF0aXZlIHRvIGNhcmQgYmFzZSAqLworI2RlZmluZSBQSV9EUkVRX01BU0sgICAgMHgwNAorCisvKiBBZGRpdGlvbmFsIFBhY2tlVHdpbiByZWdpc3RlcnMgcmVsYXRpdmUgdG8gY2FyZCBiYXNlICovCisjZGVmaW5lIFRXSU5fSU5UX1JFRyAgICAweDA4CisjZGVmaW5lIFRXSU5fQ0xSX1RNUjEgICAweDA5CisjZGVmaW5lIFRXSU5fQ0xSX1RNUjIgICAweDBhCisjZGVmaW5lIFRXSU5fU1BBUkVfMSAgICAweDBiCisjZGVmaW5lIFRXSU5fRE1BX0NGRyAgICAweDA4CisjZGVmaW5lIFRXSU5fU0VSSUFMX0NGRyAweDA5CisjZGVmaW5lIFRXSU5fRE1BX0NMUl9GRiAweDBhCisjZGVmaW5lIFRXSU5fU1BBUkVfMiAgICAweDBiCisKKworLyogUGFja2VUd2luIEkvTyByZWdpc3RlciB2YWx1ZXMgKi8KKworLyogSU5UX1JFRyAqLworI2RlZmluZSBUV0lOX1NDQ19NU0sgICAgICAgMHgwMQorI2RlZmluZSBUV0lOX1RNUjFfTVNLICAgICAgMHgwMgorI2RlZmluZSBUV0lOX1RNUjJfTVNLICAgICAgMHgwNAorI2RlZmluZSBUV0lOX0lOVF9NU0sgICAgICAgMHgwNworCisvKiBTRVJJQUxfQ0ZHICovCisjZGVmaW5lIFRXSU5fRFRSQV9PTiAgICAgICAweDAxCisjZGVmaW5lIFRXSU5fRFRSQl9PTiAgICAgICAweDAyCisjZGVmaW5lIFRXSU5fRVhUQ0xLQSAgICAgICAweDA0CisjZGVmaW5lIFRXSU5fRVhUQ0xLQiAgICAgICAweDA4CisjZGVmaW5lIFRXSU5fTE9PUEFfT04gICAgICAweDEwCisjZGVmaW5lIFRXSU5fTE9PUEJfT04gICAgICAweDIwCisjZGVmaW5lIFRXSU5fRUkgICAgICAgICAgICAweDgwCisKKy8qIERNQV9DRkcgKi8KKyNkZWZpbmUgVFdJTl9ETUFfSERYX1QxICAgIDB4MDgKKyNkZWZpbmUgVFdJTl9ETUFfSERYX1IxICAgIDB4MGEKKyNkZWZpbmUgVFdJTl9ETUFfSERYX1QzICAgIDB4MTQKKyNkZWZpbmUgVFdJTl9ETUFfSERYX1IzICAgIDB4MTYKKyNkZWZpbmUgVFdJTl9ETUFfRkRYX1QzUjEgIDB4MWIKKyNkZWZpbmUgVFdJTl9ETUFfRkRYX1QxUjMgIDB4MWQKKworCisvKiBTdGF0dXMgdmFsdWVzICovCisKKyNkZWZpbmUgSURMRSAgICAgIDAKKyNkZWZpbmUgVFhfSEVBRCAgIDEKKyNkZWZpbmUgVFhfREFUQSAgIDIKKyNkZWZpbmUgVFhfUEFVU0UgIDMKKyNkZWZpbmUgVFhfVEFJTCAgIDQKKyNkZWZpbmUgUlRTX09GRiAgIDUKKyNkZWZpbmUgV0FJVCAgICAgIDYKKyNkZWZpbmUgRENEX09OICAgIDcKKyNkZWZpbmUgUlhfT04gICAgIDgKKyNkZWZpbmUgRENEX09GRiAgIDkKKworCisvKiBJb2N0bHMgKi8KKworI2RlZmluZSBTSU9DR1NDQ1BBUkFNIFNJT0NERVZQUklWQVRFCisjZGVmaW5lIFNJT0NTU0NDUEFSQU0gKFNJT0NERVZQUklWQVRFKzEpCisKKworLyogRGF0YSB0eXBlcyAqLworCitzdHJ1Y3Qgc2NjX3BhcmFtIHsKKwlpbnQgcGNsa19oejsJCS8qIGZyZXF1ZW5jeSBvZiBCUkcgaW5wdXQgKGRvbid0IGNoYW5nZSkgKi8KKwlpbnQgYnJnX3RjOwkJLyogQlJHIHRlcm1pbmFsIGNvdW50OyBCUkcgZGlzYWJsZWQgaWYgPCAwICovCisJaW50IG5yemk7CQkvKiAwIChucnopLCAxIChucnppKSAqLworCWludCBjbG9ja3M7CQkvKiBzZWUgZG1hc2NjX2NmZyBkb2N1bWVudGF0aW9uICovCisJaW50IHR4ZGVsYXk7CQkvKiBbMS9UTVJfMF9IWl0gKi8KKwlpbnQgdHh0aW1lb3V0OwkJLyogWzEvSFpdICovCisJaW50IHR4dGFpbDsJCS8qIFsxL1RNUl8wX0haXSAqLworCWludCB3YWl0dGltZTsJCS8qIFsxL1RNUl8wX0haXSAqLworCWludCBzbG90dGltZTsJCS8qIFsxL1RNUl8wX0haXSAqLworCWludCBwZXJzaXN0OwkJLyogMSAuLi4gMjU2ICovCisJaW50IGRtYTsJCS8qIC0xIChkaXNhYmxlKSwgMCwgMSwgMyAqLworCWludCB0eHBhdXNlOwkJLyogWzEvVE1SXzBfSFpdICovCisJaW50IHJ0c29mZjsJCS8qIFsxL1RNUl8wX0haXSAqLworCWludCBkY2RvbjsJCS8qIFsxL1RNUl8wX0haXSAqLworCWludCBkY2RvZmY7CQkvKiBbMS9UTVJfMF9IWl0gKi8KK307CisKK3N0cnVjdCBzY2NfaGFyZHdhcmUgeworCWNoYXIgKm5hbWU7CisJaW50IGlvX3JlZ2lvbjsKKwlpbnQgaW9fZGVsdGE7CisJaW50IGlvX3NpemU7CisJaW50IG51bV9kZXZzOworCWludCBzY2Nfb2Zmc2V0OworCWludCB0bXJfb2Zmc2V0OworCWludCB0bXJfaHo7CisJaW50IHBjbGtfaHo7Cit9OworCitzdHJ1Y3Qgc2NjX3ByaXYgeworCWludCB0eXBlOworCWludCBjaGlwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNjY19pbmZvICppbmZvOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCBjaGFubmVsOworCWludCBjYXJkX2Jhc2UsIHNjY19jbWQsIHNjY19kYXRhOworCWludCB0bXJfY250LCB0bXJfY3RybCwgdG1yX21vZGU7CisJc3RydWN0IHNjY19wYXJhbSBwYXJhbTsKKwljaGFyIHJ4X2J1ZltOVU1fUlhfQlVGXVtCVUZfU0laRV07CisJaW50IHJ4X2xlbltOVU1fUlhfQlVGXTsKKwlpbnQgcnhfcHRyOworCXN0cnVjdCB3b3JrX3N0cnVjdCByeF93b3JrOworCWludCByeF9oZWFkLCByeF90YWlsLCByeF9jb3VudDsKKwlpbnQgcnhfb3ZlcjsKKwljaGFyIHR4X2J1ZltOVU1fVFhfQlVGXVtCVUZfU0laRV07CisJaW50IHR4X2xlbltOVU1fVFhfQlVGXTsKKwlpbnQgdHhfcHRyOworCWludCB0eF9oZWFkLCB0eF90YWlsLCB0eF9jb3VudDsKKwlpbnQgc3RhdGU7CisJdW5zaWduZWQgbG9uZyB0eF9zdGFydDsKKwlpbnQgcnIwOworCXNwaW5sb2NrX3QgKnJlZ2lzdGVyX2xvY2s7CS8qIFBlciBzY2NfaW5mbyAqLworCXNwaW5sb2NrX3QgcmluZ19sb2NrOworfTsKKworc3RydWN0IHNjY19pbmZvIHsKKwlpbnQgaXJxX3VzZWQ7CisJaW50IHR3aW5fc2VyaWFsX2NmZzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2WzJdOworCXN0cnVjdCBzY2NfcHJpdiBwcml2WzJdOworCXN0cnVjdCBzY2NfaW5mbyAqbmV4dDsKKwlzcGlubG9ja190IHJlZ2lzdGVyX2xvY2s7CS8qIFBlciBkZXZpY2UgcmVnaXN0ZXIgbG9jayAqLworfTsKKworCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgc2V0dXBfYWRhcHRlcihpbnQgY2FyZF9iYXNlLCBpbnQgdHlwZSwgaW50IG4pIF9faW5pdDsKKworc3RhdGljIHZvaWQgd3JpdGVfc2NjKHN0cnVjdCBzY2NfcHJpdiAqcHJpdiwgaW50IHJlZywgaW50IHZhbCk7CitzdGF0aWMgdm9pZCB3cml0ZV9zY2NfZGF0YShzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCB2YWwsIGludCBmYXN0KTsKK3N0YXRpYyBpbnQgcmVhZF9zY2Moc3RydWN0IHNjY19wcml2ICpwcml2LCBpbnQgcmVnKTsKK3N0YXRpYyBpbnQgcmVhZF9zY2NfZGF0YShzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpOworCitzdGF0aWMgaW50IHNjY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzY2NfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNjY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CitzdGF0aWMgaW50IHNjY19zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2NjX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2NjX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpzYSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0eF9vbihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpOworc3RhdGljIGlubGluZSB2b2lkIHJ4X29uKHN0cnVjdCBzY2NfcHJpdiAqcHJpdik7CitzdGF0aWMgaW5saW5lIHZvaWQgcnhfb2ZmKHN0cnVjdCBzY2NfcHJpdiAqcHJpdik7CitzdGF0aWMgdm9pZCBzdGFydF90aW1lcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCB0LCBpbnQgcjE1KTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByYW5kb20odm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB6ODUzMF9pc3Ioc3RydWN0IHNjY19pbmZvICppbmZvKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY2NfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgcnhfaXNyKHN0cnVjdCBzY2NfcHJpdiAqcHJpdik7CitzdGF0aWMgdm9pZCBzcGVjaWFsX2NvbmRpdGlvbihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCByYyk7CitzdGF0aWMgdm9pZCByeF9iaCh2b2lkICphcmcpOworc3RhdGljIHZvaWQgdHhfaXNyKHN0cnVjdCBzY2NfcHJpdiAqcHJpdik7CitzdGF0aWMgdm9pZCBlc19pc3Ioc3RydWN0IHNjY19wcml2ICpwcml2KTsKK3N0YXRpYyB2b2lkIHRtX2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpOworCisKKy8qIEluaXRpYWxpemF0aW9uIHZhcmlhYmxlcyAqLworCitzdGF0aWMgaW50IGlvW01BWF9OVU1fREVWU10gX19pbml0ZGF0YSA9IHsgMCwgfTsKKworLyogQmV3YXJlISBod1tdIGlzIGFsc28gdXNlZCBpbiBjbGVhbnVwX21vZHVsZSgpLiAqLworc3RhdGljIHN0cnVjdCBzY2NfaGFyZHdhcmUgaHdbTlVNX1RZUEVTXSBfX2luaXRkYXRhX29yX21vZHVsZSA9IEhBUkRXQVJFOworc3RhdGljIGNoYXIgYXgyNV9icm9hZGNhc3RbN10gX19pbml0ZGF0YSA9CisgICAgeyAnUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLAorJzAnIDw8IDEgfTsKK3N0YXRpYyBjaGFyIGF4MjVfdGVzdFs3XSBfX2luaXRkYXRhID0KKyAgICB7ICdMJyA8PCAxLCAnSScgPDwgMSwgJ04nIDw8IDEsICdVJyA8PCAxLCAnWCcgPDwgMSwgJyAnIDw8IDEsCisnMScgPDwgMSB9OworCisKKy8qIEdsb2JhbCB2YXJpYWJsZXMgKi8KKworc3RhdGljIHN0cnVjdCBzY2NfaW5mbyAqZmlyc3Q7CitzdGF0aWMgdW5zaWduZWQgbG9uZyByYW5kOworCisKK01PRFVMRV9BVVRIT1IoIktsYXVzIEt1ZGllbGthIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgaGlnaC1zcGVlZCBTQ0MgYm9hcmRzIik7CitNT0RVTEVfUEFSTShpbywgIjEtIiBfX01PRFVMRV9TVFJJTkcoTUFYX05VTV9ERVZTKSAiaSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZG1hc2NjX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NjX2luZm8gKmluZm87CisKKwl3aGlsZSAoZmlyc3QpIHsKKwkJaW5mbyA9IGZpcnN0OworCisJCS8qIFVucmVnaXN0ZXIgZGV2aWNlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJdW5yZWdpc3Rlcl9uZXRkZXYoaW5mby0+ZGV2W2ldKTsKKworCQkvKiBSZXNldCBib2FyZCAqLworCQlpZiAoaW5mby0+cHJpdlswXS50eXBlID09IFRZUEVfVFdJTikKKwkJCW91dGIoMCwgaW5mby0+ZGV2WzBdLT5iYXNlX2FkZHIgKyBUV0lOX1NFUklBTF9DRkcpOworCQl3cml0ZV9zY2MoJmluZm8tPnByaXZbMF0sIFI5LCBGSFdSRVMpOworCQlyZWxlYXNlX3JlZ2lvbihpbmZvLT5kZXZbMF0tPmJhc2VfYWRkciwKKwkJCSAgICAgICBod1tpbmZvLT5wcml2WzBdLnR5cGVdLmlvX3NpemUpOworCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCQlmcmVlX25ldGRldihpbmZvLT5kZXZbaV0pOworCisJCS8qIEZyZWUgbWVtb3J5ICovCisJCWZpcnN0ID0gaW5mby0+bmV4dDsKKwkJa2ZyZWUoaW5mbyk7CisJfQorfQorCisjaWZuZGVmIE1PRFVMRQordm9pZCBfX2luaXQgZG1hc2NjX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fREVWUyAmJiBpIDwgaW50c1swXTsgaSsrKQorCQlpb1tpXSA9IGludHNbaSArIDFdOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGRtYXNjY19pbml0KHZvaWQpCit7CisJaW50IGgsIGksIGosIG47CisJaW50IGJhc2VbTUFYX05VTV9ERVZTXSwgdGNtZFtNQVhfTlVNX0RFVlNdLCB0MFtNQVhfTlVNX0RFVlNdLAorCSAgICB0MVtNQVhfTlVNX0RFVlNdOworCXVuc2lnbmVkIHRfdmFsOworCXVuc2lnbmVkIGxvbmcgdGltZSwgc3RhcnRbTUFYX05VTV9ERVZTXSwgZGVsYXlbTUFYX05VTV9ERVZTXSwKKwkgICAgY291bnRpbmdbTUFYX05VTV9ERVZTXTsKKworCS8qIEluaXRpYWxpemUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKi8KKwlyYW5kID0gamlmZmllczsKKwkvKiBDYXJkcyBmb3VuZCA9IDAgKi8KKwluID0gMDsKKwkvKiBXYXJuaW5nIG1lc3NhZ2UgKi8KKwlpZiAoIWlvWzBdKQorCQlwcmludGsoS0VSTl9JTkZPICJkbWFzY2M6IGF1dG9wcm9iaW5nIChkYW5nZXJvdXMpXG4iKTsKKworCS8qIFJ1biBhdXRvZGV0ZWN0aW9uIGZvciBlYWNoIGNhcmQgdHlwZSAqLworCWZvciAoaCA9IDA7IGggPCBOVU1fVFlQRVM7IGgrKykgeworCisJCWlmIChpb1swXSkgeworCQkJLyogVXNlci1zcGVjaWZpZWQgSS9PIGFkZHJlc3MgcmVnaW9ucyAqLworCQkJZm9yIChpID0gMDsgaSA8IGh3W2hdLm51bV9kZXZzOyBpKyspCisJCQkJYmFzZVtpXSA9IDA7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9ERVZTICYmIGlvW2ldOyBpKyspIHsKKwkJCQlqID0gKGlvW2ldIC0KKwkJCQkgICAgIGh3W2hdLmlvX3JlZ2lvbikgLyBod1toXS5pb19kZWx0YTsKKwkJCQlpZiAoaiA+PSAwICYmIGogPCBod1toXS5udW1fZGV2cworCQkJCSAgICAmJiBod1toXS5pb19yZWdpb24gKworCQkJCSAgICBqICogaHdbaF0uaW9fZGVsdGEgPT0gaW9baV0pIHsKKwkJCQkJYmFzZVtqXSA9IGlvW2ldOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIERlZmF1bHQgSS9PIGFkZHJlc3MgcmVnaW9ucyAqLworCQkJZm9yIChpID0gMDsgaSA8IGh3W2hdLm51bV9kZXZzOyBpKyspIHsKKwkJCQliYXNlW2ldID0KKwkJCQkgICAgaHdbaF0uaW9fcmVnaW9uICsgaSAqIGh3W2hdLmlvX2RlbHRhOworCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgdmFsaWQgSS9PIGFkZHJlc3MgcmVnaW9ucyAqLworCQlmb3IgKGkgPSAwOyBpIDwgaHdbaF0ubnVtX2RldnM7IGkrKykKKwkJCWlmIChiYXNlW2ldKSB7CisJCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbgorCQkJCSAgICAoYmFzZVtpXSwgaHdbaF0uaW9fc2l6ZSwgImRtYXNjYyIpKQorCQkJCQliYXNlW2ldID0gMDsKKwkJCQllbHNlIHsKKwkJCQkJdGNtZFtpXSA9CisJCQkJCSAgICBiYXNlW2ldICsgaHdbaF0udG1yX29mZnNldCArCisJCQkJCSAgICBUTVJfQ1RSTDsKKwkJCQkJdDBbaV0gPQorCQkJCQkgICAgYmFzZVtpXSArIGh3W2hdLnRtcl9vZmZzZXQgKworCQkJCQkgICAgVE1SX0NOVDA7CisJCQkJCXQxW2ldID0KKwkJCQkJICAgIGJhc2VbaV0gKyBod1toXS50bXJfb2Zmc2V0ICsKKwkJCQkJICAgIFRNUl9DTlQxOworCQkJCX0KKwkJCX0KKworCQkvKiBTdGFydCB0aW1lcnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGh3W2hdLm51bV9kZXZzOyBpKyspCisJCQlpZiAoYmFzZVtpXSkgeworCQkJCS8qIFRpbWVyIDA6IExTQitNU0IsIE1vZGUgMywgVE1SXzBfSFogKi8KKwkJCQlvdXRiKDB4MzYsIHRjbWRbaV0pOworCQkJCW91dGIoKGh3W2hdLnRtcl9oeiAvIFRNUl8wX0haKSAmIDB4RkYsCisJCQkJICAgICB0MFtpXSk7CisJCQkJb3V0YigoaHdbaF0udG1yX2h6IC8gVE1SXzBfSFopID4+IDgsCisJCQkJICAgICB0MFtpXSk7CisJCQkJLyogVGltZXIgMTogTFNCK01TQiwgTW9kZSAwLCBIWi8xMCAqLworCQkJCW91dGIoMHg3MCwgdGNtZFtpXSk7CisJCQkJb3V0YigoVE1SXzBfSFogLyBIWiAqIDEwKSAmIDB4RkYsIHQxW2ldKTsKKwkJCQlvdXRiKChUTVJfMF9IWiAvIEhaICogMTApID4+IDgsIHQxW2ldKTsKKwkJCQlzdGFydFtpXSA9IGppZmZpZXM7CisJCQkJZGVsYXlbaV0gPSAwOworCQkJCWNvdW50aW5nW2ldID0gMTsKKwkJCQkvKiBUaW1lciAyOiBMU0IrTVNCLCBNb2RlIDAgKi8KKwkJCQlvdXRiKDB4YjAsIHRjbWRbaV0pOworCQkJfQorCQl0aW1lID0gamlmZmllczsKKwkJLyogV2FpdCB1bnRpbCBjb3VudGVyIHJlZ2lzdGVycyBhcmUgbG9hZGVkICovCisJCXVkZWxheSgyMDAwMDAwIC8gVE1SXzBfSFopOworCisJCS8qIFRpbWluZyBsb29wICovCisJCXdoaWxlIChqaWZmaWVzIC0gdGltZSA8IDEzKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgaHdbaF0ubnVtX2RldnM7IGkrKykKKwkJCQlpZiAoYmFzZVtpXSAmJiBjb3VudGluZ1tpXSkgeworCQkJCQkvKiBSZWFkIGJhY2sgVGltZXIgMTogbGF0Y2g7IHJlYWQgTFNCOyByZWFkIE1TQiAqLworCQkJCQlvdXRiKDB4NDAsIHRjbWRbaV0pOworCQkJCQl0X3ZhbCA9CisJCQkJCSAgICBpbmIodDFbaV0pICsgKGluYih0MVtpXSkgPDwgOCk7CisJCQkJCS8qIEFsc28gY2hlY2sgd2hldGhlciBjb3VudGVyIGRpZCB3cmFwICovCisJCQkJCWlmICh0X3ZhbCA9PSAwCisJCQkJCSAgICB8fCB0X3ZhbCA+IFRNUl8wX0haIC8gSFogKiAxMCkKKwkJCQkJCWNvdW50aW5nW2ldID0gMDsKKwkJCQkJZGVsYXlbaV0gPSBqaWZmaWVzIC0gc3RhcnRbaV07CisJCQkJfQorCQl9CisKKwkJLyogRXZhbHVhdGUgbWVhc3VyZW1lbnRzICovCisJCWZvciAoaSA9IDA7IGkgPCBod1toXS5udW1fZGV2czsgaSsrKQorCQkJaWYgKGJhc2VbaV0pIHsKKwkJCQlpZiAoKGRlbGF5W2ldID49IDkgJiYgZGVsYXlbaV0gPD0gMTEpICYmCisJCQkJICAgIC8qIE9rLCB3ZSBoYXZlIGZvdW5kIGFuIGFkYXB0ZXIgKi8KKwkJCQkgICAgKHNldHVwX2FkYXB0ZXIoYmFzZVtpXSwgaCwgbikgPT0gMCkpCisJCQkJCW4rKzsKKwkJCQllbHNlCisJCQkJCXJlbGVhc2VfcmVnaW9uKGJhc2VbaV0sCisJCQkJCQkgICAgICAgaHdbaF0uaW9fc2l6ZSk7CisJCQl9CisKKwl9CQkJLyogTlVNX1RZUEVTICovCisKKwkvKiBJZiBhbnkgYWRhcHRlciB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLCByZXR1cm4gb2sgKi8KKwlpZiAobikKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiBubyBhZGFwdGVyIGZvdW5kLCByZXR1cm4gZXJyb3IgKi8KKwlwcmludGsoS0VSTl9JTkZPICJkbWFzY2M6IG5vIGFkYXB0ZXJzIGZvdW5kXG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KKworbW9kdWxlX2luaXQoZG1hc2NjX2luaXQpOworbW9kdWxlX2V4aXQoZG1hc2NjX2V4aXQpOworCitzdGF0aWMgdm9pZCBkZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPnR5cGUgPSBBUlBIUkRfQVgyNTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IDczOworCWRldi0+bXR1ID0gMTUwMDsKKwlkZXYtPmFkZHJfbGVuID0gNzsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDY0OworCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgYXgyNV9icm9hZGNhc3QsIDcpOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBheDI1X3Rlc3QsIDcpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hZGFwdGVyKGludCBjYXJkX2Jhc2UsIGludCB0eXBlLCBpbnQgbikKK3sKKwlpbnQgaSwgaXJxLCBjaGlwOworCXN0cnVjdCBzY2NfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzY2NfcHJpdiAqcHJpdjsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisJdW5zaWduZWQgaW50IGlycXM7CisJaW50IHRtcl9iYXNlID0gY2FyZF9iYXNlICsgaHdbdHlwZV0udG1yX29mZnNldDsKKwlpbnQgc2NjX2Jhc2UgPSBjYXJkX2Jhc2UgKyBod1t0eXBlXS5zY2Nfb2Zmc2V0OworCWNoYXIgKmNoaXBuYW1lc1tdID0gQ0hJUE5BTUVTOworCisJLyogQWxsb2NhdGUgbWVtb3J5ICovCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2NfaW5mbyksIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzY2M6ICIKKwkJICAgICAgICJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciAlcyBhdCAlIzN4XG4iLAorCQkgICAgICAgaHdbdHlwZV0ubmFtZSwgY2FyZF9iYXNlKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSB3aGF0IGlzIG5lY2Vzc2FyeSBmb3Igd3JpdGVfc2NjIGFuZCB3cml0ZV9zY2NfZGF0YSAqLworCW1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IHNjY19pbmZvKSk7CisKKwlpbmZvLT5kZXZbMF0gPSBhbGxvY19uZXRkZXYoMCwgIiIsIGRldl9zZXR1cCk7CisJaWYgKCFpbmZvLT5kZXZbMF0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzY2M6ICIKKwkJICAgICAgICJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciAlcyBhdCAlIzN4XG4iLAorCQkgICAgICAgaHdbdHlwZV0ubmFtZSwgY2FyZF9iYXNlKTsKKwkJZ290byBvdXQxOworCX0KKworCWluZm8tPmRldlsxXSA9IGFsbG9jX25ldGRldigwLCAiIiwgZGV2X3NldHVwKTsKKwlpZiAoIWluZm8tPmRldlsxXSkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYXNjYzogIgorCQkgICAgICAgImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yICVzIGF0ICUjM3hcbiIsCisJCSAgICAgICBod1t0eXBlXS5uYW1lLCBjYXJkX2Jhc2UpOworCQlnb3RvIG91dDI7CisJfQorCXNwaW5fbG9ja19pbml0KCZpbmZvLT5yZWdpc3Rlcl9sb2NrKTsKKworCXByaXYgPSAmaW5mby0+cHJpdlswXTsKKwlwcml2LT50eXBlID0gdHlwZTsKKwlwcml2LT5jYXJkX2Jhc2UgPSBjYXJkX2Jhc2U7CisJcHJpdi0+c2NjX2NtZCA9IHNjY19iYXNlICsgU0NDQV9DTUQ7CisJcHJpdi0+c2NjX2RhdGEgPSBzY2NfYmFzZSArIFNDQ0FfREFUQTsKKwlwcml2LT5yZWdpc3Rlcl9sb2NrID0gJmluZm8tPnJlZ2lzdGVyX2xvY2s7CisKKwkvKiBSZXNldCBTQ0MgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjksIEZIV1JFUyB8IE1JRSB8IE5WKTsKKworCS8qIERldGVybWluZSB0eXBlIG9mIGNoaXAgYnkgZW5hYmxpbmcgU0RMQy9IRExDIGVuaGFuY2VtZW50cyAqLworCXdyaXRlX3NjYyhwcml2LCBSMTUsIFNIRExDRSk7CisJaWYgKCFyZWFkX3NjYyhwcml2LCBSMTUpKSB7CisJCS8qIFdSNycgbm90IHByZXNlbnQuIFRoaXMgaXMgYW4gb3JkaW5hcnkgWjg1MzAgU0NDLiAqLworCQljaGlwID0gWjg1MzA7CisJfSBlbHNlIHsKKwkJLyogUHV0IG9uZSBjaGFyYWN0ZXIgaW4gVFggRklGTyAqLworCQl3cml0ZV9zY2NfZGF0YShwcml2LCAwLCAwKTsKKwkJaWYgKHJlYWRfc2NjKHByaXYsIFIwKSAmIFR4X0JVRl9FTVApIHsKKwkJCS8qIFRYIEZJRk8gbm90IGZ1bGwuIFRoaXMgaXMgYSBaODUyMzAgRVNDQyB3aXRoIGEgNC1ieXRlIEZJRk8uICovCisJCQljaGlwID0gWjg1MjMwOworCQl9IGVsc2UgeworCQkJLyogVFggRklGTyBmdWxsLiBUaGlzIGlzIGEgWjg1QzMwIFNDQyB3aXRoIGEgMS1ieXRlIEZJRk8uICovCisJCQljaGlwID0gWjg1QzMwOworCQl9CisJfQorCXdyaXRlX3NjYyhwcml2LCBSMTUsIDApOworCisJLyogU3RhcnQgSVJRIGF1dG8tZGV0ZWN0aW9uICovCisJaXJxcyA9IHByb2JlX2lycV9vbigpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwlpZiAodHlwZSA9PSBUWVBFX1RXSU4pIHsKKwkJb3V0YigwLCBjYXJkX2Jhc2UgKyBUV0lOX0RNQV9DRkcpOworCQlpbmIoY2FyZF9iYXNlICsgVFdJTl9DTFJfVE1SMSk7CisJCWluYihjYXJkX2Jhc2UgKyBUV0lOX0NMUl9UTVIyKTsKKwkJaW5mby0+dHdpbl9zZXJpYWxfY2ZnID0gVFdJTl9FSTsKKwkJb3V0YihpbmZvLT50d2luX3NlcmlhbF9jZmcsIGNhcmRfYmFzZSArIFRXSU5fU0VSSUFMX0NGRyk7CisJfSBlbHNlIHsKKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgQ1RTSUUpOworCQl3cml0ZV9zY2MocHJpdiwgUjAsIFJFU19FWFRfSU5UKTsKKwkJd3JpdGVfc2NjKHByaXYsIFIxLCBFWFRfSU5UX0VOQUIpOworCX0KKworCS8qIFN0YXJ0IHRpbWVyICovCisJb3V0YigxLCB0bXJfYmFzZSArIFRNUl9DTlQxKTsKKwlvdXRiKDAsIHRtcl9iYXNlICsgVE1SX0NOVDEpOworCisJLyogV2FpdCBhbmQgZGV0ZWN0IElSUSAqLworCXRpbWUgPSBqaWZmaWVzOworCXdoaWxlIChqaWZmaWVzIC0gdGltZSA8IDIgKyBIWiAvIFRNUl8wX0haKTsKKwlpcnEgPSBwcm9iZV9pcnFfb2ZmKGlycXMpOworCisJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHQsIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWlmICh0eXBlID09IFRZUEVfVFdJTikgeworCQlpbmIoY2FyZF9iYXNlICsgVFdJTl9DTFJfVE1SMSk7CisJfSBlbHNlIHsKKwkJd3JpdGVfc2NjKHByaXYsIFIxLCAwKTsKKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCXdyaXRlX3NjYyhwcml2LCBSMCwgUkVTX0VYVF9JTlQpOworCX0KKworCWlmIChpcnEgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJkbWFzY2M6IGNvdWxkIG5vdCBmaW5kIGlycSBvZiAlcyBhdCAlIzN4IChpcnE9JWQpXG4iLAorCQkgICAgICAgaHdbdHlwZV0ubmFtZSwgY2FyZF9iYXNlLCBpcnEpOworCQlnb3RvIG91dDM7CisJfQorCisJLyogU2V0IHVwIGRhdGEgc3RydWN0dXJlcyAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZGV2ID0gaW5mby0+ZGV2W2ldOworCQlwcml2ID0gJmluZm8tPnByaXZbaV07CisJCXByaXYtPnR5cGUgPSB0eXBlOworCQlwcml2LT5jaGlwID0gY2hpcDsKKwkJcHJpdi0+ZGV2ID0gZGV2OworCQlwcml2LT5pbmZvID0gaW5mbzsKKwkJcHJpdi0+Y2hhbm5lbCA9IGk7CisJCXNwaW5fbG9ja19pbml0KCZwcml2LT5yaW5nX2xvY2spOworCQlwcml2LT5yZWdpc3Rlcl9sb2NrID0gJmluZm8tPnJlZ2lzdGVyX2xvY2s7CisJCXByaXYtPmNhcmRfYmFzZSA9IGNhcmRfYmFzZTsKKwkJcHJpdi0+c2NjX2NtZCA9IHNjY19iYXNlICsgKGkgPyBTQ0NCX0NNRCA6IFNDQ0FfQ01EKTsKKwkJcHJpdi0+c2NjX2RhdGEgPSBzY2NfYmFzZSArIChpID8gU0NDQl9EQVRBIDogU0NDQV9EQVRBKTsKKwkJcHJpdi0+dG1yX2NudCA9IHRtcl9iYXNlICsgKGkgPyBUTVJfQ05UMiA6IFRNUl9DTlQxKTsKKwkJcHJpdi0+dG1yX2N0cmwgPSB0bXJfYmFzZSArIFRNUl9DVFJMOworCQlwcml2LT50bXJfbW9kZSA9IGkgPyAweGIwIDogMHg3MDsKKwkJcHJpdi0+cGFyYW0ucGNsa19oeiA9IGh3W3R5cGVdLnBjbGtfaHo7CisJCXByaXYtPnBhcmFtLmJyZ190YyA9IC0xOworCQlwcml2LT5wYXJhbS5jbG9ja3MgPSBUQ1RSeENQIHwgUkNSVHhDUDsKKwkJcHJpdi0+cGFyYW0ucGVyc2lzdCA9IDI1NjsKKwkJcHJpdi0+cGFyYW0uZG1hID0gLTE7CisJCUlOSVRfV09SSygmcHJpdi0+cnhfd29yaywgcnhfYmgsIHByaXYpOworCQlkZXYtPnByaXYgPSBwcml2OworCQlzcHJpbnRmKGRldi0+bmFtZSwgImRtYXNjYyVpIiwgMiAqIG4gKyBpKTsKKwkJU0VUX01PRFVMRV9PV05FUihkZXYpOworCQlkZXYtPmJhc2VfYWRkciA9IGNhcmRfYmFzZTsKKwkJZGV2LT5pcnEgPSBpcnE7CisJCWRldi0+b3BlbiA9IHNjY19vcGVuOworCQlkZXYtPnN0b3AgPSBzY2NfY2xvc2U7CisJCWRldi0+ZG9faW9jdGwgPSBzY2NfaW9jdGw7CisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gc2NjX3NlbmRfcGFja2V0OworCQlkZXYtPmdldF9zdGF0cyA9IHNjY19nZXRfc3RhdHM7CisJCWRldi0+aGFyZF9oZWFkZXIgPSBheDI1X2VuY2Fwc3VsYXRlOworCQlkZXYtPnJlYnVpbGRfaGVhZGVyID0gYXgyNV9yZWJ1aWxkX2hlYWRlcjsKKwkJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBzY2Nfc2V0X21hY19hZGRyZXNzOworCX0KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGluZm8tPmRldlswXSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzY2M6IGNvdWxkIG5vdCByZWdpc3RlciAlc1xuIiwKKwkJICAgICAgIGluZm8tPmRldlswXS0+bmFtZSk7CisJCWdvdG8gb3V0MzsKKwl9CisJaWYgKHJlZ2lzdGVyX25ldGRldihpbmZvLT5kZXZbMV0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hc2NjOiBjb3VsZCBub3QgcmVnaXN0ZXIgJXNcbiIsCisJCSAgICAgICBpbmZvLT5kZXZbMV0tPm5hbWUpOworCQlnb3RvIG91dDQ7CisJfQorCisKKwlpbmZvLT5uZXh0ID0gZmlyc3Q7CisJZmlyc3QgPSBpbmZvOworCXByaW50ayhLRVJOX0lORk8gImRtYXNjYzogZm91bmQgJXMgKCVzKSBhdCAlIzN4LCBpcnEgJWRcbiIsCisJICAgICAgIGh3W3R5cGVdLm5hbWUsIGNoaXBuYW1lc1tjaGlwXSwgY2FyZF9iYXNlLCBpcnEpOworCXJldHVybiAwOworCisgICAgICBvdXQ0OgorCXVucmVnaXN0ZXJfbmV0ZGV2KGluZm8tPmRldlswXSk7CisgICAgICBvdXQzOgorCWlmIChpbmZvLT5wcml2WzBdLnR5cGUgPT0gVFlQRV9UV0lOKQorCQlvdXRiKDAsIGluZm8tPmRldlswXS0+YmFzZV9hZGRyICsgVFdJTl9TRVJJQUxfQ0ZHKTsKKwl3cml0ZV9zY2MoJmluZm8tPnByaXZbMF0sIFI5LCBGSFdSRVMpOworCWZyZWVfbmV0ZGV2KGluZm8tPmRldlsxXSk7CisgICAgICBvdXQyOgorCWZyZWVfbmV0ZGV2KGluZm8tPmRldlswXSk7CisgICAgICBvdXQxOgorCWtmcmVlKGluZm8pOworICAgICAgb3V0OgorCXJldHVybiAtMTsKK30KKworCisvKiBEcml2ZXIgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIHdyaXRlX3NjYyhzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCByZWcsIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzd2l0Y2ggKHByaXYtPnR5cGUpIHsKKwljYXNlIFRZUEVfUzU6CisJCWlmIChyZWcpCisJCQlvdXRiKHJlZywgcHJpdi0+c2NjX2NtZCk7CisJCW91dGIodmFsLCBwcml2LT5zY2NfY21kKTsKKwkJcmV0dXJuOworCWNhc2UgVFlQRV9UV0lOOgorCQlpZiAocmVnKQorCQkJb3V0Yl9wKHJlZywgcHJpdi0+c2NjX2NtZCk7CisJCW91dGJfcCh2YWwsIHByaXYtPnNjY19jbWQpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUocHJpdi0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOworCQlvdXRiX3AoMCwgcHJpdi0+Y2FyZF9iYXNlICsgUElfRFJFUV9NQVNLKTsKKwkJaWYgKHJlZykKKwkJCW91dGJfcChyZWcsIHByaXYtPnNjY19jbWQpOworCQlvdXRiX3AodmFsLCBwcml2LT5zY2NfY21kKTsKKwkJb3V0YigxLCBwcml2LT5jYXJkX2Jhc2UgKyBQSV9EUkVRX01BU0spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHByaXYtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KK30KKworCitzdGF0aWMgdm9pZCB3cml0ZV9zY2NfZGF0YShzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCB2YWwsIGludCBmYXN0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3dpdGNoIChwcml2LT50eXBlKSB7CisJY2FzZSBUWVBFX1M1OgorCQlvdXRiKHZhbCwgcHJpdi0+c2NjX2RhdGEpOworCQlyZXR1cm47CisJY2FzZSBUWVBFX1RXSU46CisJCW91dGJfcCh2YWwsIHByaXYtPnNjY19kYXRhKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWlmIChmYXN0KQorCQkJb3V0Yl9wKHZhbCwgcHJpdi0+c2NjX2RhdGEpOworCQllbHNlIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKHByaXYtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkJCW91dGJfcCgwLCBwcml2LT5jYXJkX2Jhc2UgKyBQSV9EUkVRX01BU0spOworCQkJb3V0Yl9wKHZhbCwgcHJpdi0+c2NjX2RhdGEpOworCQkJb3V0YigxLCBwcml2LT5jYXJkX2Jhc2UgKyBQSV9EUkVRX01BU0spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJCX0KKwkJcmV0dXJuOworCX0KK30KKworCitzdGF0aWMgaW50IHJlYWRfc2NjKHN0cnVjdCBzY2NfcHJpdiAqcHJpdiwgaW50IHJlZykKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzd2l0Y2ggKHByaXYtPnR5cGUpIHsKKwljYXNlIFRZUEVfUzU6CisJCWlmIChyZWcpCisJCQlvdXRiKHJlZywgcHJpdi0+c2NjX2NtZCk7CisJCXJldHVybiBpbmIocHJpdi0+c2NjX2NtZCk7CisJY2FzZSBUWVBFX1RXSU46CisJCWlmIChyZWcpCisJCQlvdXRiX3AocmVnLCBwcml2LT5zY2NfY21kKTsKKwkJcmV0dXJuIGluYl9wKHByaXYtPnNjY19jbWQpOworCWRlZmF1bHQ6CisJCXNwaW5fbG9ja19pcnFzYXZlKHByaXYtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkJb3V0Yl9wKDAsIHByaXYtPmNhcmRfYmFzZSArIFBJX0RSRVFfTUFTSyk7CisJCWlmIChyZWcpCisJCQlvdXRiX3AocmVnLCBwcml2LT5zY2NfY21kKTsKKwkJcmMgPSBpbmJfcChwcml2LT5zY2NfY21kKTsKKwkJb3V0YigxLCBwcml2LT5jYXJkX2Jhc2UgKyBQSV9EUkVRX01BU0spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHByaXYtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJjOworCX0KK30KKworCitzdGF0aWMgaW50IHJlYWRfc2NjX2RhdGEoc3RydWN0IHNjY19wcml2ICpwcml2KQoreworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN3aXRjaCAocHJpdi0+dHlwZSkgeworCWNhc2UgVFlQRV9TNToKKwkJcmV0dXJuIGluYihwcml2LT5zY2NfZGF0YSk7CisJY2FzZSBUWVBFX1RXSU46CisJCXJldHVybiBpbmJfcChwcml2LT5zY2NfZGF0YSk7CisJZGVmYXVsdDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUocHJpdi0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOworCQlvdXRiX3AoMCwgcHJpdi0+Y2FyZF9iYXNlICsgUElfRFJFUV9NQVNLKTsKKwkJcmMgPSBpbmJfcChwcml2LT5zY2NfZGF0YSk7CisJCW91dGIoMSwgcHJpdi0+Y2FyZF9iYXNlICsgUElfRFJFUV9NQVNLKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJCXJldHVybiByYzsKKwl9Cit9CisKKworc3RhdGljIGludCBzY2Nfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzY2NfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2NjX2luZm8gKmluZm8gPSBwcml2LT5pbmZvOworCWludCBjYXJkX2Jhc2UgPSBwcml2LT5jYXJkX2Jhc2U7CisKKwkvKiBSZXF1ZXN0IElSUSBpZiBub3QgYWxyZWFkeSB1c2VkIGJ5IG90aGVyIGNoYW5uZWwgKi8KKwlpZiAoIWluZm8tPmlycV91c2VkKSB7CisJCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgc2NjX2lzciwgMCwgImRtYXNjYyIsIGluZm8pKSB7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKwlpbmZvLT5pcnFfdXNlZCsrOworCisJLyogUmVxdWVzdCBETUEgaWYgcmVxdWlyZWQgKi8KKwlpZiAocHJpdi0+cGFyYW0uZG1hID49IDApIHsKKwkJaWYgKHJlcXVlc3RfZG1hKHByaXYtPnBhcmFtLmRtYSwgImRtYXNjYyIpKSB7CisJCQlpZiAoLS1pbmZvLT5pcnFfdXNlZCA9PSAwKQorCQkJCWZyZWVfaXJxKGRldi0+aXJxLCBpbmZvKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgbG9uZyBmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJCQljbGVhcl9kbWFfZmYocHJpdi0+cGFyYW0uZG1hKTsKKwkJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMgKi8KKwlwcml2LT5yeF9wdHIgPSAwOworCXByaXYtPnJ4X292ZXIgPSAwOworCXByaXYtPnJ4X2hlYWQgPSBwcml2LT5yeF90YWlsID0gcHJpdi0+cnhfY291bnQgPSAwOworCXByaXYtPnN0YXRlID0gSURMRTsKKwlwcml2LT50eF9oZWFkID0gcHJpdi0+dHhfdGFpbCA9IHByaXYtPnR4X2NvdW50ID0gMDsKKwlwcml2LT50eF9wdHIgPSAwOworCisJLyogUmVzZXQgY2hhbm5lbCAqLworCXdyaXRlX3NjYyhwcml2LCBSOSwgKHByaXYtPmNoYW5uZWwgPyBDSFJCIDogQ0hSQSkgfCBNSUUgfCBOVik7CisJLyogWDEgY2xvY2ssIFNETEMgbW9kZSAqLworCXdyaXRlX3NjYyhwcml2LCBSNCwgU0RMQyB8IFgxQ0xLKTsKKwkvKiBETUEgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjEsIEVYVF9JTlRfRU5BQiB8IFdUX0ZOX1JEWUZOKTsKKwkvKiA4IGJpdCBSWCBjaGFyLCBSWCBkaXNhYmxlICovCisJd3JpdGVfc2NjKHByaXYsIFIzLCBSeDgpOworCS8qIDggYml0IFRYIGNoYXIsIFRYIGRpc2FibGUgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjUsIFR4OCk7CisJLyogU0RMQyBhZGRyZXNzIGZpZWxkICovCisJd3JpdGVfc2NjKHByaXYsIFI2LCAwKTsKKwkvKiBTRExDIGZsYWcgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjcsIEZMQUcpOworCXN3aXRjaCAocHJpdi0+Y2hpcCkgeworCWNhc2UgWjg1QzMwOgorCQkvKiBTZWxlY3QgV1I3JyAqLworCQl3cml0ZV9zY2MocHJpdiwgUjE1LCBTSERMQ0UpOworCQkvKiBBdXRvIEVPTSByZXNldCAqLworCQl3cml0ZV9zY2MocHJpdiwgUjcsIEFVVE9FT00pOworCQl3cml0ZV9zY2MocHJpdiwgUjE1LCAwKTsKKwkJYnJlYWs7CisJY2FzZSBaODUyMzA6CisJCS8qIFNlbGVjdCBXUjcnICovCisJCXdyaXRlX3NjYyhwcml2LCBSMTUsIFNIRExDRSk7CisJCS8qIFRoZSBmb2xsb3dpbmcgYml0cyBhcmUgc2V0IChzZWUgMi41LjIuMSk6CisJCSAgIC0gQXV0b21hdGljIEVPTSByZXNldAorCQkgICAtIEludGVycnVwdCByZXF1ZXN0IGlmIFJYIEZJRk8gaXMgaGFsZiBmdWxsCisJCSAgIFRoaXMgYml0IHNob3VsZCBiZSBpZ25vcmVkIGluIERNQSBtb2RlIChhY2NvcmRpbmcgdG8gdGhlCisJCSAgIGRvY3VtZW50YXRpb24pLCBidXQgYWN0dWFsbHkgaXNuJ3QuIFRoZSByZWNlaXZlciBkb2Vzbid0IHdvcmsgaWYKKwkJICAgaXQgaXMgc2V0LiBUaHVzLCB3ZSBoYXZlIHRvIGNsZWFyIGl0IGluIERNQSBtb2RlLgorCQkgICAtIEludGVycnVwdC9ETUEgcmVxdWVzdCBpZiBUWCBGSUZPIGlzIGNvbXBsZXRlbHkgZW1wdHkKKwkJICAgYSkgSWYgc2V0LCB0aGUgRVNDQyBiZWhhdmVzIGFzIGlmIGl0IGhhZCBubyBUWCBGSUZPIChaODVDMzAKKwkJICAgY29tcGF0aWJpbGl0eSkuCisJCSAgIGIpIElmIGNsZWFyZWQsIERNQSByZXF1ZXN0cyBtYXkgZm9sbG93IGVhY2ggb3RoZXIgdmVyeSBxdWlja2x5LAorCQkgICBmaWxsaW5nIHVwIHRoZSBUWCBGSUZPLgorCQkgICBBZHZhbnRhZ2U6IFRYIHdvcmtzIGV2ZW4gaW4gY2FzZSBvZiBoaWdoIGJ1cyBsYXRlbmN5LgorCQkgICBEaXNhZHZhbnRhZ2U6IEVkZ2UtdHJpZ2dlcmVkIERNQSByZXF1ZXN0IGNpcmN1aXRyeSBtYXkgbWlzcworCQkgICBhIHJlcXVlc3QuIE5vIG1vcmUgZGF0YSBpcyBkZWxpdmVyZWQsIHJlc3VsdGluZworCQkgICBpbiBhIFRYIEZJRk8gdW5kZXJydW4uCisJCSAgIEJvdGggUEkyIGFuZCBTNVNDQy9ETUEgc2VlbSB0byB3b3JrIGZpbmUgd2l0aCBUWEZJRk9FIGNsZWFyZWQuCisJCSAgIFRoZSBQYWNrZVR3aW4gZG9lc24ndC4gSSBkb24ndCBrbm93IGFib3V0IHRoZSBQSSwgYnV0IGxldCdzCisJCSAgIGFzc3VtZSBpdCBiZWhhdmVzIGxpa2UgdGhlIFBJMi4KKwkJICovCisJCWlmIChwcml2LT5wYXJhbS5kbWEgPj0gMCkgeworCQkJaWYgKHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKQorCQkJCXdyaXRlX3NjYyhwcml2LCBSNywgQVVUT0VPTSB8IFRYRklGT0UpOworCQkJZWxzZQorCQkJCXdyaXRlX3NjYyhwcml2LCBSNywgQVVUT0VPTSk7CisJCX0gZWxzZSB7CisJCQl3cml0ZV9zY2MocHJpdiwgUjcsIEFVVE9FT00gfCBSWEZJRk9IKTsKKwkJfQorCQl3cml0ZV9zY2MocHJpdiwgUjE1LCAwKTsKKwkJYnJlYWs7CisJfQorCS8qIFByZXNldCBDUkMsIE5SWihJKSBlbmNvZGluZyAqLworCXdyaXRlX3NjYyhwcml2LCBSMTAsIENSQ1BTIHwgKHByaXYtPnBhcmFtLm5yemkgPyBOUlpJIDogTlJaKSk7CisKKwkvKiBDb25maWd1cmUgYmF1ZCByYXRlIGdlbmVyYXRvciAqLworCWlmIChwcml2LT5wYXJhbS5icmdfdGMgPj0gMCkgeworCQkvKiBQcm9ncmFtIEJSIGdlbmVyYXRvciAqLworCQl3cml0ZV9zY2MocHJpdiwgUjEyLCBwcml2LT5wYXJhbS5icmdfdGMgJiAweEZGKTsKKwkJd3JpdGVfc2NjKHByaXYsIFIxMywgKHByaXYtPnBhcmFtLmJyZ190YyA+PiA4KSAmIDB4RkYpOworCQkvKiBCUkcgc291cmNlID0gU1lTIENMSzsgZW5hYmxlIEJSRzsgRFRSIFJFUSBmdW5jdGlvbiAocmVxdWlyZWQgYnkKKwkJICAgUGFja2VUd2luLCBub3QgY29ubmVjdGVkIG9uIHRoZSBQSTIpOyBzZXQgRFBMTCBzb3VyY2UgdG8gQlJHICovCisJCXdyaXRlX3NjYyhwcml2LCBSMTQsIFNTQlIgfCBEVFJSRVEgfCBCUlNSQyB8IEJSRU5BQkwpOworCQkvKiBFbmFibGUgRFBMTCAqLworCQl3cml0ZV9zY2MocHJpdiwgUjE0LCBTRUFSQ0ggfCBEVFJSRVEgfCBCUlNSQyB8IEJSRU5BQkwpOworCX0gZWxzZSB7CisJCS8qIERpc2FibGUgQlIgZ2VuZXJhdG9yICovCisJCXdyaXRlX3NjYyhwcml2LCBSMTQsIERUUlJFUSB8IEJSU1JDKTsKKwl9CisKKwkvKiBDb25maWd1cmUgY2xvY2tzICovCisJaWYgKHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKSB7CisJCS8qIERpc2FibGUgZXh0ZXJuYWwgVFggY2xvY2sgcmVjZWl2ZXIgKi8KKwkJb3V0YigoaW5mby0+dHdpbl9zZXJpYWxfY2ZnICY9CisJCSAgICAgIH4ocHJpdi0+Y2hhbm5lbCA/IFRXSU5fRVhUQ0xLQiA6IFRXSU5fRVhUQ0xLQSkpLAorCQkgICAgIGNhcmRfYmFzZSArIFRXSU5fU0VSSUFMX0NGRyk7CisJfQorCXdyaXRlX3NjYyhwcml2LCBSMTEsIHByaXYtPnBhcmFtLmNsb2Nrcyk7CisJaWYgKChwcml2LT50eXBlID09IFRZUEVfVFdJTikgJiYgIShwcml2LT5wYXJhbS5jbG9ja3MgJiBUUnhDT0kpKSB7CisJCS8qIEVuYWJsZSBleHRlcm5hbCBUWCBjbG9jayByZWNlaXZlciAqLworCQlvdXRiKChpbmZvLT50d2luX3NlcmlhbF9jZmcgfD0KKwkJICAgICAgKHByaXYtPmNoYW5uZWwgPyBUV0lOX0VYVENMS0IgOiBUV0lOX0VYVENMS0EpKSwKKwkJICAgICBjYXJkX2Jhc2UgKyBUV0lOX1NFUklBTF9DRkcpOworCX0KKworCS8qIENvbmZpZ3VyZSBQYWNrZVR3aW4gKi8KKwlpZiAocHJpdi0+dHlwZSA9PSBUWVBFX1RXSU4pIHsKKwkJLyogQXNzZXJ0IERUUiwgZW5hYmxlIGludGVycnVwdHMgKi8KKwkJb3V0YigoaW5mby0+dHdpbl9zZXJpYWxfY2ZnIHw9IFRXSU5fRUkgfAorCQkgICAgICAocHJpdi0+Y2hhbm5lbCA/IFRXSU5fRFRSQl9PTiA6IFRXSU5fRFRSQV9PTikpLAorCQkgICAgIGNhcmRfYmFzZSArIFRXSU5fU0VSSUFMX0NGRyk7CisJfQorCisJLyogUmVhZCBjdXJyZW50IHN0YXR1cyAqLworCXByaXYtPnJyMCA9IHJlYWRfc2NjKHByaXYsIFIwKTsKKwkvKiBFbmFibGUgRENEIGludGVycnVwdCAqLworCXdyaXRlX3NjYyhwcml2LCBSMTUsIERDRElFKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNjY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzY2NfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2NjX2luZm8gKmluZm8gPSBwcml2LT5pbmZvOworCWludCBjYXJkX2Jhc2UgPSBwcml2LT5jYXJkX2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAocHJpdi0+dHlwZSA9PSBUWVBFX1RXSU4pIHsKKwkJLyogRHJvcCBEVFIgKi8KKwkJb3V0YigoaW5mby0+dHdpbl9zZXJpYWxfY2ZnICY9CisJCSAgICAgIChwcml2LT5jaGFubmVsID8gflRXSU5fRFRSQl9PTiA6IH5UV0lOX0RUUkFfT04pKSwKKwkJICAgICBjYXJkX2Jhc2UgKyBUV0lOX1NFUklBTF9DRkcpOworCX0KKworCS8qIFJlc2V0IGNoYW5uZWwsIGZyZWUgRE1BIGFuZCBJUlEgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjksIChwcml2LT5jaGFubmVsID8gQ0hSQiA6IENIUkEpIHwgTUlFIHwgTlYpOworCWlmIChwcml2LT5wYXJhbS5kbWEgPj0gMCkgeworCQlpZiAocHJpdi0+dHlwZSA9PSBUWVBFX1RXSU4pCisJCQlvdXRiKDAsIGNhcmRfYmFzZSArIFRXSU5fRE1BX0NGRyk7CisJCWZyZWVfZG1hKHByaXYtPnBhcmFtLmRtYSk7CisJfQorCWlmICgtLWluZm8tPmlycV91c2VkID09IDApCisJCWZyZWVfaXJxKGRldi0+aXJxLCBpbmZvKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc2NjX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBzY2NfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR1NDQ1BBUkFNOgorCQlpZiAoY29weV90b191c2VyCisJCSAgICAoaWZyLT5pZnJfZGF0YSwgJnByaXYtPnBhcmFtLAorCQkgICAgIHNpemVvZihzdHJ1Y3Qgc2NjX3BhcmFtKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBTSU9DU1NDQ1BBUkFNOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZwcml2LT5wYXJhbSwgaWZyLT5pZnJfZGF0YSwKKwkJICAgICBzaXplb2Yoc3RydWN0IHNjY19wYXJhbSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworCitzdGF0aWMgaW50IHNjY19zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzY2NfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgc2NoZWR1bGVyIGZlZWRpbmcgdXMgcGFja2V0cyAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFRyYW5zZmVyIGRhdGEgdG8gRE1BIGJ1ZmZlciAqLworCWkgPSBwcml2LT50eF9oZWFkOworCW1lbWNweShwcml2LT50eF9idWZbaV0sIHNrYi0+ZGF0YSArIDEsIHNrYi0+bGVuIC0gMSk7CisJcHJpdi0+dHhfbGVuW2ldID0gc2tiLT5sZW4gLSAxOworCisJLyogQ2xlYXIgaW50ZXJydXB0cyB3aGlsZSB3ZSB0b3VjaCBvdXIgY2lyY3VsYXIgYnVmZmVycyAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJpbmdfbG9jaywgZmxhZ3MpOworCS8qIE1vdmUgdGhlIHJpbmcgYnVmZmVyJ3MgaGVhZCAqLworCXByaXYtPnR4X2hlYWQgPSAoaSArIDEpICUgTlVNX1RYX0JVRjsKKwlwcml2LT50eF9jb3VudCsrOworCisJLyogSWYgd2UganVzdCBmaWxsZWQgdXAgdGhlIGxhc3QgYnVmZmVyLCBsZWF2ZSBxdWV1ZSBzdG9wcGVkLgorCSAgIFRoZSBoaWdoZXIgbGF5ZXJzIG11c3Qgd2FpdCB1bnRpbCB3ZSBoYXZlIGEgRE1BIGJ1ZmZlcgorCSAgIHRvIGFjY2VwdCB0aGUgZGF0YS4gKi8KKwlpZiAocHJpdi0+dHhfY291bnQgPCBOVU1fVFhfQlVGKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwkvKiBTZXQgbmV3IFRYIHN0YXRlICovCisJaWYgKHByaXYtPnN0YXRlID09IElETEUpIHsKKwkJLyogQXNzZXJ0IFJUUywgc3RhcnQgdGltZXIgKi8KKwkJcHJpdi0+c3RhdGUgPSBUWF9IRUFEOworCQlwcml2LT50eF9zdGFydCA9IGppZmZpZXM7CisJCXdyaXRlX3NjYyhwcml2LCBSNSwgVHhDUkNfRU5BQiB8IFJUUyB8IFR4RU5BQiB8IFR4OCk7CisJCXdyaXRlX3NjYyhwcml2LCBSMTUsIDApOworCQlzdGFydF90aW1lcihwcml2LCBwcml2LT5wYXJhbS50eGRlbGF5LCAwKTsKKwl9CisKKwkvKiBUdXJuIGludGVycnVwdHMgYmFjayBvbiBhbmQgZnJlZSBidWZmZXIgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yaW5nX2xvY2ssIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNjY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJnByaXYtPnN0YXRzOworfQorCisKK3N0YXRpYyBpbnQgc2NjX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpzYSkKK3sKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgKChzdHJ1Y3Qgc29ja2FkZHIgKikgc2EpLT5zYV9kYXRhLAorCSAgICAgICBkZXYtPmFkZHJfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgdHhfb24oc3RydWN0IHNjY19wcml2ICpwcml2KQoreworCWludCBpLCBuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocHJpdi0+cGFyYW0uZG1hID49IDApIHsKKwkJbiA9IChwcml2LT5jaGlwID09IFo4NTIzMCkgPyAzIDogMTsKKwkJLyogUHJvZ3JhbSBETUEgY29udHJvbGxlciAqLworCQlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJCXNldF9kbWFfbW9kZShwcml2LT5wYXJhbS5kbWEsIERNQV9NT0RFX1dSSVRFKTsKKwkJc2V0X2RtYV9hZGRyKHByaXYtPnBhcmFtLmRtYSwKKwkJCSAgICAgKGludCkgcHJpdi0+dHhfYnVmW3ByaXYtPnR4X3RhaWxdICsgbik7CisJCXNldF9kbWFfY291bnQocHJpdi0+cGFyYW0uZG1hLAorCQkJICAgICAgcHJpdi0+dHhfbGVuW3ByaXYtPnR4X3RhaWxdIC0gbik7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQkvKiBFbmFibGUgVFggdW5kZXJydW4gaW50ZXJydXB0ICovCisJCXdyaXRlX3NjYyhwcml2LCBSMTUsIFR4VUlFKTsKKwkJLyogQ29uZmlndXJlIERSRVEgKi8KKwkJaWYgKHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKQorCQkJb3V0YigocHJpdi0+cGFyYW0uZG1hID09CisJCQkgICAgICAxKSA/IFRXSU5fRE1BX0hEWF9UMSA6IFRXSU5fRE1BX0hEWF9UMywKKwkJCSAgICAgcHJpdi0+Y2FyZF9iYXNlICsgVFdJTl9ETUFfQ0ZHKTsKKwkJZWxzZQorCQkJd3JpdGVfc2NjKHByaXYsIFIxLAorCQkJCSAgRVhUX0lOVF9FTkFCIHwgV1RfRk5fUkRZRk4gfAorCQkJCSAgV1RfUkRZX0VOQUIpOworCQkvKiBXcml0ZSBmaXJzdCBieXRlKHMpICovCisJCXNwaW5fbG9ja19pcnFzYXZlKHByaXYtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJCXdyaXRlX3NjY19kYXRhKHByaXYsCisJCQkJICAgICAgIHByaXYtPnR4X2J1Zltwcml2LT50eF90YWlsXVtpXSwgMSk7CisJCWVuYWJsZV9kbWEocHJpdi0+cGFyYW0uZG1hKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgVHhVSUUpOworCQl3cml0ZV9zY2MocHJpdiwgUjEsCisJCQkgIEVYVF9JTlRfRU5BQiB8IFdUX0ZOX1JEWUZOIHwgVHhJTlRfRU5BQik7CisJCXR4X2lzcihwcml2KTsKKwl9CisJLyogUmVzZXQgRU9NIGxhdGNoIGlmIHdlIGRvIG5vdCBoYXZlIHRoZSBBVVRPRU9NIGZlYXR1cmUgKi8KKwlpZiAocHJpdi0+Y2hpcCA9PSBaODUzMCkKKwkJd3JpdGVfc2NjKHByaXYsIFIwLCBSRVNfRU9NX0wpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByeF9vbihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIENsZWFyIFJYIEZJRk8gKi8KKwl3aGlsZSAocmVhZF9zY2MocHJpdiwgUjApICYgUnhfQ0hfQVYpCisJCXJlYWRfc2NjX2RhdGEocHJpdik7CisJcHJpdi0+cnhfb3ZlciA9IDA7CisJaWYgKHByaXYtPnBhcmFtLmRtYSA+PSAwKSB7CisJCS8qIFByb2dyYW0gRE1BIGNvbnRyb2xsZXIgKi8KKwkJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCQlzZXRfZG1hX21vZGUocHJpdi0+cGFyYW0uZG1hLCBETUFfTU9ERV9SRUFEKTsKKwkJc2V0X2RtYV9hZGRyKHByaXYtPnBhcmFtLmRtYSwKKwkJCSAgICAgKGludCkgcHJpdi0+cnhfYnVmW3ByaXYtPnJ4X2hlYWRdKTsKKwkJc2V0X2RtYV9jb3VudChwcml2LT5wYXJhbS5kbWEsIEJVRl9TSVpFKTsKKwkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCWVuYWJsZV9kbWEocHJpdi0+cGFyYW0uZG1hKTsKKwkJLyogQ29uZmlndXJlIFBhY2tlVHdpbiBETUEgKi8KKwkJaWYgKHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKSB7CisJCQlvdXRiKChwcml2LT5wYXJhbS5kbWEgPT0KKwkJCSAgICAgIDEpID8gVFdJTl9ETUFfSERYX1IxIDogVFdJTl9ETUFfSERYX1IzLAorCQkJICAgICBwcml2LT5jYXJkX2Jhc2UgKyBUV0lOX0RNQV9DRkcpOworCQl9CisJCS8qIFNwLiBjb25kLiBpbnRyLiBvbmx5LCBleHQgaW50IGVuYWJsZSwgUlggRE1BIGVuYWJsZSAqLworCQl3cml0ZV9zY2MocHJpdiwgUjEsIEVYVF9JTlRfRU5BQiB8IElOVF9FUlJfUnggfAorCQkJICBXVF9SRFlfUlQgfCBXVF9GTl9SRFlGTiB8IFdUX1JEWV9FTkFCKTsKKwl9IGVsc2UgeworCQkvKiBSZXNldCBjdXJyZW50IGZyYW1lICovCisJCXByaXYtPnJ4X3B0ciA9IDA7CisJCS8qIEludHIuIG9uIGFsbCBSeCBjaGFyYWN0ZXJzIGFuZCBTcC4gY29uZC4sIGV4dCBpbnQgZW5hYmxlICovCisJCXdyaXRlX3NjYyhwcml2LCBSMSwgRVhUX0lOVF9FTkFCIHwgSU5UX0FMTF9SeCB8IFdUX1JEWV9SVCB8CisJCQkgIFdUX0ZOX1JEWUZOKTsKKwl9CisJd3JpdGVfc2NjKHByaXYsIFIwLCBFUlJfUkVTKTsKKwl3cml0ZV9zY2MocHJpdiwgUjMsIFJ4RU5BQkxFIHwgUng4IHwgUnhDUkNfRU5BQik7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHJ4X29mZihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpCit7CisJLyogRGlzYWJsZSByZWNlaXZlciAqLworCXdyaXRlX3NjYyhwcml2LCBSMywgUng4KTsKKwkvKiBEaXNhYmxlIERSRVEgLyBSWCBpbnRlcnJ1cHQgKi8KKwlpZiAocHJpdi0+cGFyYW0uZG1hID49IDAgJiYgcHJpdi0+dHlwZSA9PSBUWVBFX1RXSU4pCisJCW91dGIoMCwgcHJpdi0+Y2FyZF9iYXNlICsgVFdJTl9ETUFfQ0ZHKTsKKwllbHNlCisJCXdyaXRlX3NjYyhwcml2LCBSMSwgRVhUX0lOVF9FTkFCIHwgV1RfRk5fUkRZRk4pOworCS8qIERpc2FibGUgRE1BICovCisJaWYgKHByaXYtPnBhcmFtLmRtYSA+PSAwKQorCQlkaXNhYmxlX2RtYShwcml2LT5wYXJhbS5kbWEpOworfQorCisKK3N0YXRpYyB2b2lkIHN0YXJ0X3RpbWVyKHN0cnVjdCBzY2NfcHJpdiAqcHJpdiwgaW50IHQsIGludCByMTUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW91dGIocHJpdi0+dG1yX21vZGUsIHByaXYtPnRtcl9jdHJsKTsKKwlpZiAodCA9PSAwKSB7CisJCXRtX2lzcihwcml2KTsKKwl9IGVsc2UgaWYgKHQgPiAwKSB7CisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKwkJb3V0Yih0ICYgMHhGRiwgcHJpdi0+dG1yX2NudCk7CisJCW91dGIoKHQgPj4gOCkgJiAweEZGLCBwcml2LT50bXJfY250KTsKKwkJaWYgKHByaXYtPnR5cGUgIT0gVFlQRV9UV0lOKSB7CisJCQl3cml0ZV9zY2MocHJpdiwgUjE1LCByMTUgfCBDVFNJRSk7CisJCQlwcml2LT5ycjAgfD0gQ1RTOworCQl9CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmFuZG9tKHZvaWQpCit7CisJLyogU2VlICJOdW1lcmljYWwgUmVjaXBlcyBpbiBDIiwgc2Vjb25kIGVkaXRpb24sIHAuIDI4NCAqLworCXJhbmQgPSByYW5kICogMTY2NDUyNUwgKyAxMDEzOTA0MjIzTDsKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpIChyYW5kID4+IDI0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHo4NTMwX2lzcihzdHJ1Y3Qgc2NjX2luZm8gKmluZm8pCit7CisJaW50IGlzLCBpID0gMTAwOworCisJd2hpbGUgKChpcyA9IHJlYWRfc2NjKCZpbmZvLT5wcml2WzBdLCBSMykpICYmIGktLSkgeworCQlpZiAoaXMgJiBDSEFSeElQKSB7CisJCQlyeF9pc3IoJmluZm8tPnByaXZbMF0pOworCQl9IGVsc2UgaWYgKGlzICYgQ0hBVHhJUCkgeworCQkJdHhfaXNyKCZpbmZvLT5wcml2WzBdKTsKKwkJfSBlbHNlIGlmIChpcyAmIENIQUVYVCkgeworCQkJZXNfaXNyKCZpbmZvLT5wcml2WzBdKTsKKwkJfSBlbHNlIGlmIChpcyAmIENIQlJ4SVApIHsKKwkJCXJ4X2lzcigmaW5mby0+cHJpdlsxXSk7CisJCX0gZWxzZSBpZiAoaXMgJiBDSEJUeElQKSB7CisJCQl0eF9pc3IoJmluZm8tPnByaXZbMV0pOworCQl9IGVsc2UgeworCQkJZXNfaXNyKCZpbmZvLT5wcml2WzFdKTsKKwkJfQorCQl3cml0ZV9zY2MoJmluZm8tPnByaXZbMF0sIFIwLCBSRVNfSF9JVVMpOworCQlpKys7CisJfQorCWlmIChpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYXNjYzogc3R1Y2sgaW4gSVNSIHdpdGggUlIzPTB4JTAyeC5cbiIsCisJCSAgICAgICBpcyk7CisJfQorCS8qIE9rLCBubyBpbnRlcnJ1cHRzIHBlbmRpbmcgZnJvbSB0aGlzIDg1MzAuIFRoZSBJTlQgbGluZSBzaG91bGQKKwkgICBiZSBpbmFjdGl2ZSBub3cuICovCit9CisKKworc3RhdGljIGlycXJldHVybl90IHNjY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc2NjX2luZm8gKmluZm8gPSBkZXZfaWQ7CisKKwlzcGluX2xvY2soaW5mby0+cHJpdlswXS5yZWdpc3Rlcl9sb2NrKTsKKwkvKiBBdCB0aGlzIHBvaW50IGludGVycnVwdHMgYXJlIGVuYWJsZWQsIGFuZCB0aGUgaW50ZXJydXB0IHVuZGVyIHNlcnZpY2UKKwkgICBpcyBhbHJlYWR5IGFja25vd2xlZGdlZCwgYnV0IG1hc2tlZCBvZmYuCisKKwkgICBJbnRlcnJ1cHQgcHJvY2Vzc2luZzogV2UgbG9vcCB1bnRpbCB3ZSBrbm93IHRoYXQgdGhlIElSUSBsaW5lIGlzCisJICAgbG93LiBJZiBhbm90aGVyIHBvc2l0aXZlIGVkZ2Ugb2NjdXJzIGFmdGVyd2FyZHMgZHVyaW5nIHRoZSBJU1IsCisJICAgYW5vdGhlciBpbnRlcnJ1cHQgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgdGhlIGludGVycnVwdCBjb250cm9sbGVyCisJICAgYXMgc29vbiBhcyB0aGUgSVJRIGxldmVsIGlzIGVuYWJsZWQgYWdhaW4gKHNlZSBhc20vaXJxLmgpLgorCisJICAgQm90dG9tLWhhbGYgaGFuZGxlcnMgd2lsbCBiZSBwcm9jZXNzZWQgYWZ0ZXIgc2NjX2lzcigpLiBUaGlzIGlzCisJICAgaW1wb3J0YW50LCBzaW5jZSB3ZSBvbmx5IGhhdmUgc21hbGwgcmluZ2J1ZmZlcnMgYW5kIHdhbnQgbmV3IGRhdGEKKwkgICB0byBiZSBmZXRjaGVkL2RlbGl2ZXJlZCBpbW1lZGlhdGVseS4gKi8KKworCWlmIChpbmZvLT5wcml2WzBdLnR5cGUgPT0gVFlQRV9UV0lOKSB7CisJCWludCBpcywgY2FyZF9iYXNlID0gaW5mby0+cHJpdlswXS5jYXJkX2Jhc2U7CisJCXdoaWxlICgoaXMgPSB+aW5iKGNhcmRfYmFzZSArIFRXSU5fSU5UX1JFRykpICYKKwkJICAgICAgIFRXSU5fSU5UX01TSykgeworCQkJaWYgKGlzICYgVFdJTl9TQ0NfTVNLKSB7CisJCQkJejg1MzBfaXNyKGluZm8pOworCQkJfSBlbHNlIGlmIChpcyAmIFRXSU5fVE1SMV9NU0spIHsKKwkJCQlpbmIoY2FyZF9iYXNlICsgVFdJTl9DTFJfVE1SMSk7CisJCQkJdG1faXNyKCZpbmZvLT5wcml2WzBdKTsKKwkJCX0gZWxzZSB7CisJCQkJaW5iKGNhcmRfYmFzZSArIFRXSU5fQ0xSX1RNUjIpOworCQkJCXRtX2lzcigmaW5mby0+cHJpdlsxXSk7CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJejg1MzBfaXNyKGluZm8pOworCXNwaW5fdW5sb2NrKGluZm8tPnByaXZbMF0ucmVnaXN0ZXJfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyB2b2lkIHJ4X2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpCit7CisJaWYgKHByaXYtPnBhcmFtLmRtYSA+PSAwKSB7CisJCS8qIENoZWNrIHNwZWNpYWwgY29uZGl0aW9uIGFuZCBwZXJmb3JtIGVycm9yIHJlc2V0LiBTZWUgMi40LjcuNS4gKi8KKwkJc3BlY2lhbF9jb25kaXRpb24ocHJpdiwgcmVhZF9zY2MocHJpdiwgUjEpKTsKKwkJd3JpdGVfc2NjKHByaXYsIFIwLCBFUlJfUkVTKTsKKwl9IGVsc2UgeworCQkvKiBDaGVjayBzcGVjaWFsIGNvbmRpdGlvbiBmb3IgZWFjaCBjaGFyYWN0ZXIuIEVycm9yIHJlc2V0IG5vdCBuZWNlc3NhcnkuCisJCSAgIFNhbWUgYWxnb3JpdGhtIGZvciBTQ0MgYW5kIEVTQ0MuIFNlZSAyLjQuNy4xIGFuZCAyLjQuNy40LiAqLworCQlpbnQgcmM7CisJCXdoaWxlIChyZWFkX3NjYyhwcml2LCBSMCkgJiBSeF9DSF9BVikgeworCQkJcmMgPSByZWFkX3NjYyhwcml2LCBSMSk7CisJCQlpZiAocHJpdi0+cnhfcHRyIDwgQlVGX1NJWkUpCisJCQkJcHJpdi0+cnhfYnVmW3ByaXYtPnJ4X2hlYWRdW3ByaXYtPgorCQkJCQkJCSAgICByeF9wdHIrK10gPQorCQkJCSAgICByZWFkX3NjY19kYXRhKHByaXYpOworCQkJZWxzZSB7CisJCQkJcHJpdi0+cnhfb3ZlciA9IDI7CisJCQkJcmVhZF9zY2NfZGF0YShwcml2KTsKKwkJCX0KKwkJCXNwZWNpYWxfY29uZGl0aW9uKHByaXYsIHJjKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBzcGVjaWFsX2NvbmRpdGlvbihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCByYykKK3sKKwlpbnQgY2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFNlZSBGaWd1cmUgMi0xNS4gT25seSBvdmVycnVuIGFuZCBFT0YgbmVlZCB0byBiZSBjaGVja2VkLiAqLworCisJaWYgKHJjICYgUnhfT1ZSKSB7CisJCS8qIFJlY2VpdmVyIG92ZXJydW4gKi8KKwkJcHJpdi0+cnhfb3ZlciA9IDE7CisJCWlmIChwcml2LT5wYXJhbS5kbWEgPCAwKQorCQkJd3JpdGVfc2NjKHByaXYsIFIwLCBFUlJfUkVTKTsKKwl9IGVsc2UgaWYgKHJjICYgRU5EX0ZSKSB7CisJCS8qIEVuZCBvZiBmcmFtZS4gR2V0IGJ5dGUgY291bnQgKi8KKwkJaWYgKHByaXYtPnBhcmFtLmRtYSA+PSAwKSB7CisJCQlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJCQljYiA9IEJVRl9TSVpFIC0gZ2V0X2RtYV9yZXNpZHVlKHByaXYtPnBhcmFtLmRtYSkgLQorCQkJICAgIDI7CisJCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCWNiID0gcHJpdi0+cnhfcHRyIC0gMjsKKwkJfQorCQlpZiAocHJpdi0+cnhfb3ZlcikgeworCQkJLyogV2UgaGFkIGFuIG92ZXJydW4gKi8KKwkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHByaXYtPnJ4X292ZXIgPT0gMikKKwkJCQlwcml2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQllbHNlCisJCQkJcHJpdi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCXByaXYtPnJ4X292ZXIgPSAwOworCQl9IGVsc2UgaWYgKHJjICYgQ1JDX0VSUikgeworCQkJLyogQ291bnQgaW52YWxpZCBDUkMgb25seSBpZiBwYWNrZXQgbGVuZ3RoID49IG1pbmltdW0gKi8KKwkJCWlmIChjYiA+PSAxNSkgeworCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChjYiA+PSAxNSkgeworCQkJCWlmIChwcml2LT5yeF9jb3VudCA8IE5VTV9SWF9CVUYgLSAxKSB7CisJCQkJCS8qIFB1dCBnb29kIGZyYW1lIGluIEZJRk8gKi8KKwkJCQkJcHJpdi0+cnhfbGVuW3ByaXYtPnJ4X2hlYWRdID0gY2I7CisJCQkJCXByaXYtPnJ4X2hlYWQgPQorCQkJCQkgICAgKHByaXYtPnJ4X2hlYWQgKworCQkJCQkgICAgIDEpICUgTlVNX1JYX0JVRjsKKwkJCQkJcHJpdi0+cnhfY291bnQrKzsKKwkJCQkJc2NoZWR1bGVfd29yaygmcHJpdi0+cnhfd29yayk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCXByaXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIEdldCByZWFkeSBmb3IgbmV3IGZyYW1lICovCisJCWlmIChwcml2LT5wYXJhbS5kbWEgPj0gMCkgeworCQkJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCQkJc2V0X2RtYV9hZGRyKHByaXYtPnBhcmFtLmRtYSwKKwkJCQkgICAgIChpbnQpIHByaXYtPnJ4X2J1Zltwcml2LT5yeF9oZWFkXSk7CisJCQlzZXRfZG1hX2NvdW50KHByaXYtPnBhcmFtLmRtYSwgQlVGX1NJWkUpOworCQkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCX0gZWxzZSB7CisJCQlwcml2LT5yeF9wdHIgPSAwOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHJ4X2JoKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYgPSBhcmc7CisJaW50IGkgPSBwcml2LT5yeF90YWlsOworCWludCBjYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yaW5nX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAocHJpdi0+cnhfY291bnQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmluZ19sb2NrLCBmbGFncyk7CisJCWNiID0gcHJpdi0+cnhfbGVuW2ldOworCQkvKiBBbGxvY2F0ZSBidWZmZXIgKi8KKwkJc2tiID0gZGV2X2FsbG9jX3NrYihjYiArIDEpOworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCS8qIERyb3AgcGFja2V0ICovCisJCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCX0gZWxzZSB7CisJCQkvKiBGaWxsIGJ1ZmZlciAqLworCQkJZGF0YSA9IHNrYl9wdXQoc2tiLCBjYiArIDEpOworCQkJZGF0YVswXSA9IDA7CisJCQltZW1jcHkoJmRhdGFbMV0sIHByaXYtPnJ4X2J1ZltpXSwgY2IpOworCQkJc2tiLT5kZXYgPSBwcml2LT5kZXY7CisJCQlza2ItPnByb3RvY29sID0gbnRvaHMoRVRIX1BfQVgyNSk7CisJCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCQluZXRpZl9yeChza2IpOworCQkJcHJpdi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IGNiOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yaW5nX2xvY2ssIGZsYWdzKTsKKwkJLyogTW92ZSB0YWlsICovCisJCXByaXYtPnJ4X3RhaWwgPSBpID0gKGkgKyAxKSAlIE5VTV9SWF9CVUY7CisJCXByaXYtPnJ4X2NvdW50LS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJpbmdfbG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIHR4X2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpCit7CisJaW50IGkgPSBwcml2LT50eF90YWlsLCBwID0gcHJpdi0+dHhfcHRyOworCisJLyogU3VzcGVuZCBUWCBpbnRlcnJ1cHRzIGlmIHdlIGRvbid0IHdhbnQgdG8gc2VuZCBhbnl0aGluZy4KKwkgICBTZWUgRmlndXJlIDItMjIuICovCisJaWYgKHAgPT0gcHJpdi0+dHhfbGVuW2ldKSB7CisJCXdyaXRlX3NjYyhwcml2LCBSMCwgUkVTX1R4X1ApOworCQlyZXR1cm47CisJfQorCisJLyogV3JpdGUgY2hhcmFjdGVycyAqLworCXdoaWxlICgocmVhZF9zY2MocHJpdiwgUjApICYgVHhfQlVGX0VNUCkgJiYgcCA8IHByaXYtPnR4X2xlbltpXSkgeworCQl3cml0ZV9zY2NfZGF0YShwcml2LCBwcml2LT50eF9idWZbaV1bcCsrXSwgMCk7CisJfQorCisJLyogUmVzZXQgRU9NIGxhdGNoIG9mIFo4NTMwICovCisJaWYgKCFwcml2LT50eF9wdHIgJiYgcCAmJiBwcml2LT5jaGlwID09IFo4NTMwKQorCQl3cml0ZV9zY2MocHJpdiwgUjAsIFJFU19FT01fTCk7CisKKwlwcml2LT50eF9wdHIgPSBwOworfQorCisKK3N0YXRpYyB2b2lkIGVzX2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpCit7CisJaW50IGksIHJyMCwgZHJyMCwgcmVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBSZWFkIHN0YXR1cywgcmVzZXQgaW50ZXJydXB0IGJpdCAob3BlbiBsYXRjaGVzKSAqLworCXJyMCA9IHJlYWRfc2NjKHByaXYsIFIwKTsKKwl3cml0ZV9zY2MocHJpdiwgUjAsIFJFU19FWFRfSU5UKTsKKwlkcnIwID0gcHJpdi0+cnIwIF4gcnIwOworCXByaXYtPnJyMCA9IHJyMDsKKworCS8qIFRyYW5zbWl0IHVuZGVycnVuICgyLjQuOS42KS4gV2UgY2FuJ3QgY2hlY2sgdGhlIFR4RU9NIGZsYWcsIHNpbmNlCisJICAgaXQgbWlnaHQgaGF2ZSBhbHJlYWR5IGJlZW4gY2xlYXJlZCBhZ2FpbiBieSBBVVRPRU9NLiAqLworCWlmIChwcml2LT5zdGF0ZSA9PSBUWF9EQVRBKSB7CisJCS8qIEdldCByZW1haW5pbmcgYnl0ZXMgKi8KKwkJaSA9IHByaXYtPnR4X3RhaWw7CisJCWlmIChwcml2LT5wYXJhbS5kbWEgPj0gMCkgeworCQkJZGlzYWJsZV9kbWEocHJpdi0+cGFyYW0uZG1hKTsKKwkJCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwkJCXJlcyA9IGdldF9kbWFfcmVzaWR1ZShwcml2LT5wYXJhbS5kbWEpOworCQkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCX0gZWxzZSB7CisJCQlyZXMgPSBwcml2LT50eF9sZW5baV0gLSBwcml2LT50eF9wdHI7CisJCQlwcml2LT50eF9wdHIgPSAwOworCQl9CisJCS8qIERpc2FibGUgRFJFUSAvIFRYIGludGVycnVwdCAqLworCQlpZiAocHJpdi0+cGFyYW0uZG1hID49IDAgJiYgcHJpdi0+dHlwZSA9PSBUWVBFX1RXSU4pCisJCQlvdXRiKDAsIHByaXYtPmNhcmRfYmFzZSArIFRXSU5fRE1BX0NGRyk7CisJCWVsc2UKKwkJCXdyaXRlX3NjYyhwcml2LCBSMSwgRVhUX0lOVF9FTkFCIHwgV1RfRk5fUkRZRk4pOworCQlpZiAocmVzKSB7CisJCQkvKiBVcGRhdGUgcGFja2V0IHN0YXRpc3RpY3MgKi8KKwkJCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJcHJpdi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCS8qIE90aGVyIHVuZGVycnVuIGludGVycnVwdHMgbWF5IGFscmVhZHkgYmUgd2FpdGluZyAqLworCQkJd3JpdGVfc2NjKHByaXYsIFIwLCBSRVNfRVhUX0lOVCk7CisJCQl3cml0ZV9zY2MocHJpdiwgUjAsIFJFU19FWFRfSU5UKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFVwZGF0ZSBwYWNrZXQgc3RhdGlzdGljcyAqLworCQkJcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gcHJpdi0+dHhfbGVuW2ldOworCQkJLyogUmVtb3ZlIGZyYW1lIGZyb20gRklGTyAqLworCQkJcHJpdi0+dHhfdGFpbCA9IChpICsgMSkgJSBOVU1fVFhfQlVGOworCQkJcHJpdi0+dHhfY291bnQtLTsKKwkJCS8qIEluZm9ybSB1cHBlciBsYXllcnMgKi8KKwkJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+ZGV2KTsKKwkJfQorCQkvKiBTd2l0Y2ggc3RhdGUgKi8KKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCWlmIChwcml2LT50eF9jb3VudCAmJgorCQkgICAgKGppZmZpZXMgLSBwcml2LT50eF9zdGFydCkgPCBwcml2LT5wYXJhbS50eHRpbWVvdXQpIHsKKwkJCXByaXYtPnN0YXRlID0gVFhfUEFVU0U7CisJCQlzdGFydF90aW1lcihwcml2LCBwcml2LT5wYXJhbS50eHBhdXNlLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnN0YXRlID0gVFhfVEFJTDsKKwkJCXN0YXJ0X3RpbWVyKHByaXYsIHByaXYtPnBhcmFtLnR4dGFpbCwgMCk7CisJCX0KKwl9CisKKwkvKiBEQ0QgdHJhbnNpdGlvbiAqLworCWlmIChkcnIwICYgRENEKSB7CisJCWlmIChycjAgJiBEQ0QpIHsKKwkJCXN3aXRjaCAocHJpdi0+c3RhdGUpIHsKKwkJCWNhc2UgSURMRToKKwkJCWNhc2UgV0FJVDoKKwkJCQlwcml2LT5zdGF0ZSA9IERDRF9PTjsKKwkJCQl3cml0ZV9zY2MocHJpdiwgUjE1LCAwKTsKKwkJCQlzdGFydF90aW1lcihwcml2LCBwcml2LT5wYXJhbS5kY2RvbiwgMCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHByaXYtPnN0YXRlKSB7CisJCQljYXNlIFJYX09OOgorCQkJCXJ4X29mZihwcml2KTsKKwkJCQlwcml2LT5zdGF0ZSA9IERDRF9PRkY7CisJCQkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCQkJc3RhcnRfdGltZXIocHJpdiwgcHJpdi0+cGFyYW0uZGNkb2ZmLCAwKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIENUUyB0cmFuc2l0aW9uICovCisJaWYgKChkcnIwICYgQ1RTKSAmJiAofnJyMCAmIENUUykgJiYgcHJpdi0+dHlwZSAhPSBUWVBFX1RXSU4pCisJCXRtX2lzcihwcml2KTsKKworfQorCisKK3N0YXRpYyB2b2lkIHRtX2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpCit7CisJc3dpdGNoIChwcml2LT5zdGF0ZSkgeworCWNhc2UgVFhfSEVBRDoKKwljYXNlIFRYX1BBVVNFOgorCQl0eF9vbihwcml2KTsKKwkJcHJpdi0+c3RhdGUgPSBUWF9EQVRBOworCQlicmVhazsKKwljYXNlIFRYX1RBSUw6CisJCXdyaXRlX3NjYyhwcml2LCBSNSwgVHhDUkNfRU5BQiB8IFR4OCk7CisJCXByaXYtPnN0YXRlID0gUlRTX09GRjsKKwkJaWYgKHByaXYtPnR5cGUgIT0gVFlQRV9UV0lOKQorCQkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCXN0YXJ0X3RpbWVyKHByaXYsIHByaXYtPnBhcmFtLnJ0c29mZiwgMCk7CisJCWJyZWFrOworCWNhc2UgUlRTX09GRjoKKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgRENESUUpOworCQlwcml2LT5ycjAgPSByZWFkX3NjYyhwcml2LCBSMCk7CisJCWlmIChwcml2LT5ycjAgJiBEQ0QpIHsKKwkJCXByaXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCXJ4X29uKHByaXYpOworCQkJcHJpdi0+c3RhdGUgPSBSWF9PTjsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnN0YXRlID0gV0FJVDsKKwkJCXN0YXJ0X3RpbWVyKHByaXYsIHByaXYtPnBhcmFtLndhaXR0aW1lLCBEQ0RJRSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXQUlUOgorCQlpZiAocHJpdi0+dHhfY291bnQpIHsKKwkJCXByaXYtPnN0YXRlID0gVFhfSEVBRDsKKwkJCXByaXYtPnR4X3N0YXJ0ID0gamlmZmllczsKKwkJCXdyaXRlX3NjYyhwcml2LCBSNSwKKwkJCQkgIFR4Q1JDX0VOQUIgfCBSVFMgfCBUeEVOQUIgfCBUeDgpOworCQkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCQlzdGFydF90aW1lcihwcml2LCBwcml2LT5wYXJhbS50eGRlbGF5LCAwKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnN0YXRlID0gSURMRTsKKwkJCWlmIChwcml2LT50eXBlICE9IFRZUEVfVFdJTikKKwkJCQl3cml0ZV9zY2MocHJpdiwgUjE1LCBEQ0RJRSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBEQ0RfT046CisJY2FzZSBEQ0RfT0ZGOgorCQl3cml0ZV9zY2MocHJpdiwgUjE1LCBEQ0RJRSk7CisJCXByaXYtPnJyMCA9IHJlYWRfc2NjKHByaXYsIFIwKTsKKwkJaWYgKHByaXYtPnJyMCAmIERDRCkgeworCQkJcnhfb24ocHJpdik7CisJCQlwcml2LT5zdGF0ZSA9IFJYX09OOworCQl9IGVsc2UgeworCQkJcHJpdi0+c3RhdGUgPSBXQUlUOworCQkJc3RhcnRfdGltZXIocHJpdiwKKwkJCQkgICAgcmFuZG9tKCkgLyBwcml2LT5wYXJhbS5wZXJzaXN0ICoKKwkJCQkgICAgcHJpdi0+cGFyYW0uc2xvdHRpbWUsIERDRElFKTsKKwkJfQorCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9oZGxjZHJ2LmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9oZGxjZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5OTU5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2hkbGNkcnYuYwpAQCAtMCwwICsxLDgxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJaGRsY2Rydi5jICAtLSBIRExDIHBhY2tldCByYWRpbyBuZXR3b3JrIGRyaXZlci4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCAgVGhvbWFzIFNhaWxlciAoc2FpbGVyQGlmZS5lZS5ldGh6LmNoKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBHUEwgYWxsb3dzIHlvdSB0byB1c2UgdGhlIGRyaXZlciwgTk9UIHRoZSByYWRpby4KKyAqICBJbiBvcmRlciB0byB1c2UgdGhlIHJhZGlvLCB5b3UgbmVlZCBhIGxpY2Vuc2UgZnJvbSB0aGUgY29tbXVuaWNhdGlvbnMKKyAqICBhdXRob3JpdHkgb2YgeW91ciBjb3VudHJ5LgorICoKKyAqICBUaGUgZHJpdmVyIHdhcyBkZXJpdmVkIGZyb20gRG9uYWxkIEJlY2tlcnMgc2tlbGV0b24uYworICoJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogIEhpc3Rvcnk6CisgKiAgIDAuMSAgMjEuMDkuMTk5NiAgU3RhcnRlZAorICogICAgICAgIDE4LjEwLjE5OTYgIENoYW5nZWQgdG8gbmV3IHVzZXIgc3BhY2UgYWNjZXNzIHJvdXRpbmVzIAorICogICAgICAgICAgICAgICAgICAgIChjb3B5X3t0byxmcm9tfV91c2VyKQorICogICAwLjIgIDIxLjExLjE5OTYgIHZhcmlvdXMgc21hbGwgY2hhbmdlcworICogICAwLjMgIDAzLjAzLjE5OTcgIGZpeGVkIChob3BlZnVsbHkpIElQIG5vdCB3b3JraW5nIHdpdGggYXguMjUgYXMgYSBtb2R1bGUKKyAqICAgMC40ICAxNi4wNC4xOTk3ICBpbml0IGNvZGUvZGF0YSB0YWdnZWQKKyAqICAgMC41ICAzMC4wNy4xOTk3ICBtYWRlIEhETEMgYnVmZmVycyBiaWdnZXIgKHNvbHZlcyBhIHByb2JsZW0gd2l0aCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICBzb3VuZG1vZGVtIGRyaXZlcikKKyAqICAgMC42ICAwNS4wNC4xOTk4ICBhZGQgc3BpbmxvY2tzCisgKiAgIDAuNyAgMDMuMDguMTk5OSAgcmVtb3ZlZCBzb21lIG9sZCBjb21wYXRpYmlsaXR5IGNydWZ0CisgKiAgIDAuOCAgMTIuMDIuMjAwMCAgYWRhcHRlZCB0byBzb2Z0bmV0IGRyaXZlciBpbnRlcmZhY2UKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaGRsY2Rydi5oPgorLyogcHJvdG90eXBlcyBmb3IgYXgyNV9lbmNhcHN1bGF0ZSBhbmQgYXgyNV9yZWJ1aWxkX2hlYWRlciAqLworI2luY2x1ZGUgPG5ldC9heDI1Lmg+IAorCisvKiBtYWtlIGdlbmtzeW1zIGhhcHB5ICovCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBUaGUgbmFtZSBvZiB0aGUgY2FyZC4gSXMgdXNlZCBmb3IgbWVzc2FnZXMgYW5kIGluIHRoZSByZXF1ZXN0cyBmb3IKKyAqIGlvIHJlZ2lvbnMsIGlycXMgYW5kIGRtYSBjaGFubmVscworICovCisKK3N0YXRpYyBjaGFyIGF4MjVfYmNhc3RbQVgyNV9BRERSX0xFTl0gPQoreydRJyA8PCAxLCAnUycgPDwgMSwgJ1QnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcwJyA8PCAxfTsKK3N0YXRpYyBjaGFyIGF4MjVfbm9jYWxsW0FYMjVfQUREUl9MRU5dID0KK3snTCcgPDwgMSwgJ0knIDw8IDEsICdOJyA8PCAxLCAnVScgPDwgMSwgJ1gnIDw8IDEsICcgJyA8PCAxLCAnMScgPDwgMX07CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtJU1NfVkVSQk9TRQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBQQVJBTV9UWERFTEFZICAgMQorI2RlZmluZSBQQVJBTV9QRVJTSVNUICAgMgorI2RlZmluZSBQQVJBTV9TTE9UVElNRSAgMworI2RlZmluZSBQQVJBTV9UWFRBSUwgICAgNAorI2RlZmluZSBQQVJBTV9GVUxMRFVQICAgNQorI2RlZmluZSBQQVJBTV9IQVJEV0FSRSAgNgorI2RlZmluZSBQQVJBTV9SRVRVUk4gICAgMjU1CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIHRoZSBDUkMgcm91dGluZXMgYXJlIHN0b2xlbiBmcm9tIFdBTVBFUworICogYnkgRGlldGVyIERleWtlCisgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcHBlbmRfY3JjX2NjaXR0KHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKyAJdW5zaWduZWQgaW50IGNyYyA9IGNyY19jY2l0dCgweGZmZmYsIGJ1ZmZlciwgbGVuKSBeIDB4ZmZmZjsKKwkqYnVmZmVyKysgPSBjcmM7CisJKmJ1ZmZlcisrID0gY3JjID4+IDg7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfY3JjX2NjaXR0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNudCkKK3sKKwlyZXR1cm4gKGNyY19jY2l0dCgweGZmZmYsIGJ1ZiwgY250KSAmIDB4ZmZmZikgPT0gMHhmMGI4OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAwCitzdGF0aWMgaW50IGNhbGNfY3JjX2NjaXR0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNudCkKK3sKKwl1bnNpZ25lZCBpbnQgY3JjID0gMHhmZmZmOworCisJZm9yICg7IGNudCA+IDA7IGNudC0tKQorCQljcmMgPSAoY3JjID4+IDgpIF4gY3JjX2NjaXR0X3RhYmxlWyhjcmMgXiAqYnVmKyspICYgMHhmZl07CisJY3JjIF49IDB4ZmZmZjsKKwlyZXR1cm4gKGNyYyAmIDB4ZmZmZik7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIHRlbm1zX3RvXzJmbGFncyhzLHRlbm1zKSAoKHRlbm1zICogcy0+cGFyLmJpdHJhdGUpIC8gMTAwIC8gMTYpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGUgSERMQyByb3V0aW5lcworICovCisKK3N0YXRpYyBpbnQgaGRsY19yeF9hZGRfYnl0ZXMoc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBiaXRzLCAKKwkJCSAgICAgaW50IG51bSkKK3sKKwlpbnQgYWRkZWQgPSAwOworCQorCXdoaWxlIChzLT5oZGxjcngucnhfc3RhdGUgJiYgbnVtID49IDgpIHsKKwkJaWYgKHMtPmhkbGNyeC5sZW4gPj0gc2l6ZW9mKHMtPmhkbGNyeC5idWZmZXIpKSB7CisJCQlzLT5oZGxjcngucnhfc3RhdGUgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKnMtPmhkbGNyeC5icCsrID0gYml0cyA+PiAoMzItbnVtKTsKKwkJcy0+aGRsY3J4LmxlbisrOworCQludW0gLT0gODsKKwkJYWRkZWQgKz0gODsKKwl9CisJcmV0dXJuIGFkZGVkOworfQorCitzdGF0aWMgdm9pZCBoZGxjX3J4X2ZsYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcGt0X2xlbjsKKwl1bnNpZ25lZCBjaGFyICpjcDsKKworCWlmIChzLT5oZGxjcngubGVuIDwgNCkgCisJCXJldHVybjsKKwlpZiAoIWNoZWNrX2NyY19jY2l0dChzLT5oZGxjcnguYnVmZmVyLCBzLT5oZGxjcngubGVuKSkgCisJCXJldHVybjsKKwlwa3RfbGVuID0gcy0+aGRsY3J4LmxlbiAtIDIgKyAxOyAvKiBLSVNTIGtsdWRnZSAqLworCWlmICghKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbikpKSB7CisJCXByaW50aygiJXM6IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXRcbiIsIGRldi0+bmFtZSk7CisJCXMtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKwlza2ItPmRldiA9IGRldjsKKwljcCA9IHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkqY3ArKyA9IDA7IC8qIEtJU1Mga2x1ZGdlICovCisJbWVtY3B5KGNwLCBzLT5oZGxjcnguYnVmZmVyLCBwa3RfbGVuIC0gMSk7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FYMjUpOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJcy0+c3RhdHMucnhfcGFja2V0cysrOworfQorCit2b2lkIGhkbGNkcnZfcmVjZWl2ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IG1hc2sxLCBtYXNrMiwgbWFzazMsIG1hc2s0LCBtYXNrNSwgbWFzazYsIHdvcmQ7CisJCisJaWYgKCFzIHx8IHMtPm1hZ2ljICE9IEhETENEUlZfTUFHSUMpIAorCQlyZXR1cm47CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnMtPmhkbGNyeC5pbl9oZGxjX3J4KSkKKwkJcmV0dXJuOworCisJd2hpbGUgKCFoZGxjZHJ2X2hidWZfZW1wdHkoJnMtPmhkbGNyeC5oYnVmKSkgeworCQl3b3JkID0gaGRsY2Rydl9oYnVmX2dldCgmcy0+aGRsY3J4LmhidWYpOwkKKworI2lmZGVmIEhETENEUlZfREVCVUcKKwkJaGRsY2Rydl9hZGRfYml0YnVmZmVyX3dvcmQoJnMtPmJpdGJ1Zl9oZGxjLCB3b3JkKTsKKyNlbmRpZiAvKiBIRExDRFJWX0RFQlVHICovCisJICAgICAgIAlzLT5oZGxjcnguYml0c3RyZWFtID4+PSAxNjsKKwkJcy0+aGRsY3J4LmJpdHN0cmVhbSB8PSB3b3JkIDw8IDE2OworCQlzLT5oZGxjcnguYml0YnVmID4+PSAxNjsKKwkJcy0+aGRsY3J4LmJpdGJ1ZiB8PSB3b3JkIDw8IDE2OworCQlzLT5oZGxjcngubnVtYml0cyArPSAxNjsKKwkJZm9yKGkgPSAxNSwgbWFzazEgPSAweDFmYzAwLCBtYXNrMiA9IDB4MWZlMDAsIG1hc2szID0gMHgwZmMwMCwKKwkJICAgIG1hc2s0ID0gMHgxZjgwMCwgbWFzazUgPSAweGY4MDAsIG1hc2s2ID0gMHhmZmZmOyAKKwkJICAgIGkgPj0gMDsgCisJCSAgICBpLS0sIG1hc2sxIDw8PSAxLCBtYXNrMiA8PD0gMSwgbWFzazMgPDw9IDEsIG1hc2s0IDw8PSAxLCAKKwkJICAgIG1hc2s1IDw8PSAxLCBtYXNrNiA9IChtYXNrNiA8PCAxKSB8IDEpIHsKKwkJCWlmICgocy0+aGRsY3J4LmJpdHN0cmVhbSAmIG1hc2sxKSA9PSBtYXNrMSkKKwkJCQlzLT5oZGxjcngucnhfc3RhdGUgPSAwOyAvKiBhYm9ydCByZWNlaXZlZCAqLworCQkJZWxzZSBpZiAoKHMtPmhkbGNyeC5iaXRzdHJlYW0gJiBtYXNrMikgPT0gbWFzazMpIHsKKwkJCQkvKiBmbGFnIHJlY2VpdmVkICovCisJCQkJaWYgKHMtPmhkbGNyeC5yeF9zdGF0ZSkgeworCQkJCQloZGxjX3J4X2FkZF9ieXRlcyhzLCBzLT5oZGxjcnguYml0YnVmIAorCQkJCQkJCSAgPDwgKDgraSksCisJCQkJCQkJICBzLT5oZGxjcngubnVtYml0cworCQkJCQkJCSAgLTgtaSk7CisJCQkJCWhkbGNfcnhfZmxhZyhkZXYsIHMpOworCQkJCX0KKwkJCQlzLT5oZGxjcngubGVuID0gMDsKKwkJCQlzLT5oZGxjcnguYnAgPSBzLT5oZGxjcnguYnVmZmVyOworCQkJCXMtPmhkbGNyeC5yeF9zdGF0ZSA9IDE7CisJCQkJcy0+aGRsY3J4Lm51bWJpdHMgPSBpOworCQkJfSBlbHNlIGlmICgocy0+aGRsY3J4LmJpdHN0cmVhbSAmIG1hc2s0KSA9PSBtYXNrNSkgeworCQkJCS8qIHN0dWZmZWQgYml0ICovCisJCQkJcy0+aGRsY3J4Lm51bWJpdHMtLTsKKwkJCQlzLT5oZGxjcnguYml0YnVmID0gKHMtPmhkbGNyeC5iaXRidWYgJiAofm1hc2s2KSkgfAorCQkJCQkoKHMtPmhkbGNyeC5iaXRidWYgJiBtYXNrNikgPDwgMSk7CisJCQl9CisJCX0KKwkJcy0+aGRsY3J4Lm51bWJpdHMgLT0gaGRsY19yeF9hZGRfYnl0ZXMocywgcy0+aGRsY3J4LmJpdGJ1ZiwKKwkJCQkJCSAgICAgICBzLT5oZGxjcngubnVtYml0cyk7CisJfQorCWNsZWFyX2JpdCgwLCAmcy0+aGRsY3J4LmluX2hkbGNfcngpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19raXNzX3BhcmFtcyhzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcywKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCisjaWZkZWYgS0lTU19WRVJCT1NFCisjZGVmaW5lIFBLUChhLGIpIHByaW50ayhLRVJOX0lORk8gImhkbGNkcnYuYzogY2hhbm5lbCBwYXJhbXM6ICIgYSAiXG4iLCBiKQorI2Vsc2UgLyogS0lTU19WRVJCT1NFICovCSAgICAgIAorI2RlZmluZSBQS1AoYSxiKSAKKyNlbmRpZiAvKiBLSVNTX1ZFUkJPU0UgKi8JICAgICAgCisKKwlpZiAobGVuIDwgMikKKwkJcmV0dXJuOworCXN3aXRjaChkYXRhWzBdKSB7CisJY2FzZSBQQVJBTV9UWERFTEFZOgorCQlzLT5jaF9wYXJhbXMudHhfZGVsYXkgPSBkYXRhWzFdOworCQlQS1AoIlRYIGRlbGF5ID0gJXVtcyIsIDEwICogcy0+Y2hfcGFyYW1zLnR4X2RlbGF5KTsKKwkJYnJlYWs7CisJY2FzZSBQQVJBTV9QRVJTSVNUOiAgIAorCQlzLT5jaF9wYXJhbXMucHBlcnNpc3QgPSBkYXRhWzFdOworCQlQS1AoInAgcGVyc2lzdGVuY2UgPSAldSIsIHMtPmNoX3BhcmFtcy5wcGVyc2lzdCk7CisJCWJyZWFrOworCWNhc2UgUEFSQU1fU0xPVFRJTUU6ICAKKwkJcy0+Y2hfcGFyYW1zLnNsb3R0aW1lID0gZGF0YVsxXTsKKwkJUEtQKCJzbG90IHRpbWUgPSAldW1zIiwgcy0+Y2hfcGFyYW1zLnNsb3R0aW1lKTsKKwkJYnJlYWs7CisJY2FzZSBQQVJBTV9UWFRBSUw6ICAgIAorCQlzLT5jaF9wYXJhbXMudHhfdGFpbCA9IGRhdGFbMV07CisJCVBLUCgiVFggdGFpbCA9ICV1bXMiLCBzLT5jaF9wYXJhbXMudHhfdGFpbCk7CisJCWJyZWFrOworCWNhc2UgUEFSQU1fRlVMTERVUDogICAKKwkJcy0+Y2hfcGFyYW1zLmZ1bGxkdXAgPSAhIWRhdGFbMV07CisJCVBLUCgiJXMgZHVwbGV4Iiwgcy0+Y2hfcGFyYW1zLmZ1bGxkdXAgPyAiZnVsbCIgOiAiaGFsZiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisjdW5kZWYgUEtQCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBoZGxjZHJ2X3RyYW5zbWl0dGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBoZGxjZHJ2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGludCBtYXNrMSwgbWFzazIsIG1hc2szOworCWludCBpOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHBrdF9sZW47CisKKwlpZiAoIXMgfHwgcy0+bWFnaWMgIT0gSERMQ0RSVl9NQUdJQykgCisJCXJldHVybjsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmcy0+aGRsY3R4LmluX2hkbGNfdHgpKQorCQlyZXR1cm47CisJZm9yICg7OykgeworCQlpZiAocy0+aGRsY3R4Lm51bWJpdHMgPj0gMTYpIHsKKwkJCWlmIChoZGxjZHJ2X2hidWZfZnVsbCgmcy0+aGRsY3R4LmhidWYpKSB7CisJCQkJY2xlYXJfYml0KDAsICZzLT5oZGxjdHguaW5faGRsY190eCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaGRsY2Rydl9oYnVmX3B1dCgmcy0+aGRsY3R4LmhidWYsIHMtPmhkbGN0eC5iaXRidWYpOworCQkJcy0+aGRsY3R4LmJpdGJ1ZiA+Pj0gMTY7CisJCQlzLT5oZGxjdHgubnVtYml0cyAtPSAxNjsKKwkJfQorCQlzd2l0Y2ggKHMtPmhkbGN0eC50eF9zdGF0ZSkgeworCQlkZWZhdWx0OgorCQkJY2xlYXJfYml0KDAsICZzLT5oZGxjdHguaW5faGRsY190eCk7CisJCQlyZXR1cm47CisJCWNhc2UgMDoKKwkJY2FzZSAxOgorCQkJaWYgKHMtPmhkbGN0eC5udW1mbGFncykgeworCQkJCXMtPmhkbGN0eC5udW1mbGFncy0tOworCQkJCXMtPmhkbGN0eC5iaXRidWYgfD0gCisJCQkJCTB4N2U3ZSA8PCBzLT5oZGxjdHgubnVtYml0czsKKwkJCQlzLT5oZGxjdHgubnVtYml0cyArPSAxNjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzLT5oZGxjdHgudHhfc3RhdGUgPT0gMSkgeworCQkJCWNsZWFyX2JpdCgwLCAmcy0+aGRsY3R4LmluX2hkbGNfdHgpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICghKHNrYiA9IHMtPnNrYikpIHsKKwkJCQlpbnQgZmxncyA9IHRlbm1zX3RvXzJmbGFncyhzLCBzLT5jaF9wYXJhbXMudHhfdGFpbCk7CisJCQkJaWYgKGZsZ3MgPCAyKQorCQkJCQlmbGdzID0gMjsKKwkJCQlzLT5oZGxjdHgudHhfc3RhdGUgPSAxOworCQkJCXMtPmhkbGN0eC5udW1mbGFncyA9IGZsZ3M7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzLT5za2IgPSBOVUxMOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJcGt0X2xlbiA9IHNrYi0+bGVuLTE7IC8qIHN0cmlwIEtJU1MgYnl0ZSAqLworCQkJaWYgKHBrdF9sZW4gPj0gSERMQ0RSVl9NQVhGTEVOIHx8IHBrdF9sZW4gPCAyKSB7CisJCQkJcy0+aGRsY3R4LnR4X3N0YXRlID0gMDsKKwkJCQlzLT5oZGxjdHgubnVtZmxhZ3MgPSAxOworCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1jcHkocy0+aGRsY3R4LmJ1ZmZlciwgc2tiLT5kYXRhKzEsIHBrdF9sZW4pOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCXMtPmhkbGN0eC5icCA9IHMtPmhkbGN0eC5idWZmZXI7CisJCQlhcHBlbmRfY3JjX2NjaXR0KHMtPmhkbGN0eC5idWZmZXIsIHBrdF9sZW4pOworCQkJcy0+aGRsY3R4LmxlbiA9IHBrdF9sZW4rMjsgLyogdGhlIGFwcGVuZGVkIENSQyAqLworCQkJcy0+aGRsY3R4LnR4X3N0YXRlID0gMjsKKwkJCXMtPmhkbGN0eC5iaXRzdHJlYW0gPSAwOworCQkJcy0+c3RhdHMudHhfcGFja2V0cysrOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlmICghcy0+aGRsY3R4LmxlbikgeworCQkJCXMtPmhkbGN0eC50eF9zdGF0ZSA9IDA7CisJCQkJcy0+aGRsY3R4Lm51bWZsYWdzID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXMtPmhkbGN0eC5sZW4tLTsKKwkJCXMtPmhkbGN0eC5iaXRidWYgfD0gKnMtPmhkbGN0eC5icCA8PAorCQkJCXMtPmhkbGN0eC5udW1iaXRzOworCQkJcy0+aGRsY3R4LmJpdHN0cmVhbSA+Pj0gODsKKwkJCXMtPmhkbGN0eC5iaXRzdHJlYW0gfD0gKCpzLT5oZGxjdHguYnArKykgPDwgMTY7CisJCQltYXNrMSA9IDB4MWYwMDA7CisJCQltYXNrMiA9IDB4MTAwMDA7CisJCQltYXNrMyA9IDB4ZmZmZmZmZmYgPj4gKDMxLXMtPmhkbGN0eC5udW1iaXRzKTsKKwkJCXMtPmhkbGN0eC5udW1iaXRzICs9IDg7CisJCQlmb3IoaSA9IDA7IGkgPCA4OyBpKyssIG1hc2sxIDw8PSAxLCBtYXNrMiA8PD0gMSwgCisJCQkgICAgbWFzazMgPSAobWFzazMgPDwgMSkgfCAxKSB7CisJCQkJaWYgKChzLT5oZGxjdHguYml0c3RyZWFtICYgbWFzazEpICE9IG1hc2sxKSAKKwkJCQkJY29udGludWU7CisJCQkJcy0+aGRsY3R4LmJpdHN0cmVhbSAmPSB+bWFzazI7CisJCQkJcy0+aGRsY3R4LmJpdGJ1ZiA9IAorCQkJCQkocy0+aGRsY3R4LmJpdGJ1ZiAmIG1hc2szKSB8CisJCQkJCQkoKHMtPmhkbGN0eC5iaXRidWYgJiAKKwkJCQkJCSAofm1hc2szKSkgPDwgMSk7CisJCQkJcy0+aGRsY3R4Lm51bWJpdHMrKzsKKwkJCQltYXNrMyA9IChtYXNrMyA8PCAxKSB8IDE7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBzdGFydF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcykKK3sKKwlzLT5oZGxjdHgudHhfc3RhdGUgPSAwOworCXMtPmhkbGN0eC5udW1mbGFncyA9IHRlbm1zX3RvXzJmbGFncyhzLCBzLT5jaF9wYXJhbXMudHhfZGVsYXkpOworCXMtPmhkbGN0eC5iaXRidWYgPSBzLT5oZGxjdHguYml0c3RyZWFtID0gcy0+aGRsY3R4Lm51bWJpdHMgPSAwOworCWhkbGNkcnZfdHJhbnNtaXR0ZXIoZGV2LCBzKTsKKwlzLT5oZGxjdHgucHR0ID0gMTsKKwlzLT5wdHRfa2V5ZWQrKzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmFuZG9tX3NlZWQ7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcmFuZG9tX251bSh2b2lkKQoreworCXJhbmRvbV9zZWVkID0gMjg2MjkgKiByYW5kb21fc2VlZCArIDE1NzsKKwlyZXR1cm4gcmFuZG9tX3NlZWQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBoZGxjZHJ2X2FyYml0cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcykKK3sKKwlpZiAoIXMgfHwgcy0+bWFnaWMgIT0gSERMQ0RSVl9NQUdJQyB8fCBzLT5oZGxjdHgucHR0IHx8ICFzLT5za2IpIAorCQlyZXR1cm47CisJaWYgKHMtPmNoX3BhcmFtcy5mdWxsZHVwKSB7CisJCXN0YXJ0X3R4KGRldiwgcyk7CisJCXJldHVybjsKKwl9CisJaWYgKHMtPmhkbGNyeC5kY2QpIHsKKwkJcy0+aGRsY3R4LnNsb3RjbnQgPSBzLT5jaF9wYXJhbXMuc2xvdHRpbWU7CisJCXJldHVybjsKKwl9CisJaWYgKCgtLXMtPmhkbGN0eC5zbG90Y250KSA+IDApCisJCXJldHVybjsKKwlzLT5oZGxjdHguc2xvdGNudCA9IHMtPmNoX3BhcmFtcy5zbG90dGltZTsKKwlpZiAoKHJhbmRvbV9udW0oKSAlIDI1NikgPiBzLT5jaF9wYXJhbXMucHBlcnNpc3QpCisJCXJldHVybjsKKwlzdGFydF90eChkZXYsIHMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT0gbmV0d29yayBkcml2ZXIgaW50ZXJmYWNlID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitzdGF0aWMgaW50IGhkbGNkcnZfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqc20gPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHNrYi0+ZGF0YVswXSAhPSAwKSB7CisJCWRvX2tpc3NfcGFyYW1zKHNtLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHNtLT5za2IpCisJCXJldHVybiAtMTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc20tPnNrYiA9IHNrYjsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgaGRsY2Rydl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKWFkZHI7CisKKwkvKiBhZGRyIGlzIGFuIEFYLjI1IHNoaWZ0ZWQgQVNDSUkgbWFjIGFkZHJlc3MgKi8KKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOyAKKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpoZGxjZHJ2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoZGxjZHJ2X3N0YXRlICpzbSA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiAKKwkgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4gIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZQorCSAqIGNhcmQgb3BlbiBvciBjbG9zZWQuIAorCSAqLworCXJldHVybiAmc20tPnN0YXRzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICogc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCisKK3N0YXRpYyBpbnQgaGRsY2Rydl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJaWYgKCFzLT5vcHMgfHwgIXMtPm9wcy0+b3BlbikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIGluaXRpYWxpc2Ugc29tZSB2YXJpYWJsZXMKKwkgKi8KKwlzLT5vcGVuZWQgPSAxOworCXMtPmhkbGNyeC5oYnVmLnJkID0gcy0+aGRsY3J4LmhidWYud3IgPSAwOworCXMtPmhkbGNyeC5pbl9oZGxjX3J4ID0gMDsKKwlzLT5oZGxjcngucnhfc3RhdGUgPSAwOworCQorCXMtPmhkbGN0eC5oYnVmLnJkID0gcy0+aGRsY3R4LmhidWYud3IgPSAwOworCXMtPmhkbGN0eC5pbl9oZGxjX3R4ID0gMDsKKwlzLT5oZGxjdHgudHhfc3RhdGUgPSAxOworCXMtPmhkbGN0eC5udW1mbGFncyA9IDA7CisJcy0+aGRsY3R4LmJpdHN0cmVhbSA9IHMtPmhkbGN0eC5iaXRidWYgPSBzLT5oZGxjdHgubnVtYml0cyA9IDA7CisJcy0+aGRsY3R4LnB0dCA9IDA7CisJcy0+aGRsY3R4LnNsb3RjbnQgPSBzLT5jaF9wYXJhbXMuc2xvdHRpbWU7CisJcy0+aGRsY3R4LmNhbGlicmF0ZSA9IDA7CisKKwlpID0gcy0+b3BzLT5vcGVuKGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogCisgKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIGhkbGNkcnZfb3BlbigpLiAKKyAqLworCitzdGF0aWMgaW50IGhkbGNkcnZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcyA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGkgPSAwOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKHMtPm9wcyAmJiBzLT5vcHMtPmNsb3NlKQorCQlpID0gcy0+b3BzLT5jbG9zZShkZXYpOworCWlmIChzLT5za2IpCisJCWRldl9rZnJlZV9za2Iocy0+c2tiKTsKKwlzLT5za2IgPSBOVUxMOworCXMtPm9wZW5lZCA9IDA7CisJcmV0dXJuIGk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGhkbGNkcnZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBoZGxjZHJ2X2lvY3RsIGJpOworCisJaWYgKGNtZCAhPSBTSU9DREVWUFJJVkFURSkgeworCQlpZiAocy0+b3BzICYmIHMtPm9wcy0+aW9jdGwpCisJCQlyZXR1cm4gcy0+b3BzLT5pb2N0bChkZXYsIGlmciwgJmJpLCBjbWQpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJmJpLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoYmkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGJpLmNtZCkgeworCWRlZmF1bHQ6CisJCWlmIChzLT5vcHMgJiYgcy0+b3BzLT5pb2N0bCkKKwkJCXJldHVybiBzLT5vcHMtPmlvY3RsKGRldiwgaWZyLCAmYmksIGNtZCk7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwljYXNlIEhETENEUlZDVExfR0VUQ0hBTk5FTFBBUjoKKwkJYmkuZGF0YS5jcC50eF9kZWxheSA9IHMtPmNoX3BhcmFtcy50eF9kZWxheTsKKwkJYmkuZGF0YS5jcC50eF90YWlsID0gcy0+Y2hfcGFyYW1zLnR4X3RhaWw7CisJCWJpLmRhdGEuY3Auc2xvdHRpbWUgPSBzLT5jaF9wYXJhbXMuc2xvdHRpbWU7CisJCWJpLmRhdGEuY3AucHBlcnNpc3QgPSBzLT5jaF9wYXJhbXMucHBlcnNpc3Q7CisJCWJpLmRhdGEuY3AuZnVsbGR1cCA9IHMtPmNoX3BhcmFtcy5mdWxsZHVwOworCQlicmVhazsKKworCWNhc2UgSERMQ0RSVkNUTF9TRVRDSEFOTkVMUEFSOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcy0+Y2hfcGFyYW1zLnR4X2RlbGF5ID0gYmkuZGF0YS5jcC50eF9kZWxheTsKKwkJcy0+Y2hfcGFyYW1zLnR4X3RhaWwgPSBiaS5kYXRhLmNwLnR4X3RhaWw7CisJCXMtPmNoX3BhcmFtcy5zbG90dGltZSA9IGJpLmRhdGEuY3Auc2xvdHRpbWU7CisJCXMtPmNoX3BhcmFtcy5wcGVyc2lzdCA9IGJpLmRhdGEuY3AucHBlcnNpc3Q7CisJCXMtPmNoX3BhcmFtcy5mdWxsZHVwID0gYmkuZGF0YS5jcC5mdWxsZHVwOworCQlzLT5oZGxjdHguc2xvdGNudCA9IDE7CisJCXJldHVybiAwOworCQkKKwljYXNlIEhETENEUlZDVExfR0VUTU9ERU1QQVI6CisJCWJpLmRhdGEubXAuaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJCWJpLmRhdGEubXAuaXJxID0gZGV2LT5pcnE7CisJCWJpLmRhdGEubXAuZG1hID0gZGV2LT5kbWE7CisJCWJpLmRhdGEubXAuZG1hMiA9IHMtPnB0dF9vdXQuZG1hMjsKKwkJYmkuZGF0YS5tcC5zZXJpb2Jhc2UgPSBzLT5wdHRfb3V0LnNlcmlvYmFzZTsKKwkJYmkuZGF0YS5tcC5wYXJpb2Jhc2UgPSBzLT5wdHRfb3V0LnBhcmlvYmFzZTsKKwkJYmkuZGF0YS5tcC5taWRpaW9iYXNlID0gcy0+cHR0X291dC5taWRpaW9iYXNlOworCQlicmVhazsKKworCWNhc2UgSERMQ0RSVkNUTF9TRVRNT0RFTVBBUjoKKwkJaWYgKCghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkgfHwgbmV0aWZfcnVubmluZyhkZXYpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWRldi0+YmFzZV9hZGRyID0gYmkuZGF0YS5tcC5pb2Jhc2U7CisJCWRldi0+aXJxID0gYmkuZGF0YS5tcC5pcnE7CisJCWRldi0+ZG1hID0gYmkuZGF0YS5tcC5kbWE7CisJCXMtPnB0dF9vdXQuZG1hMiA9IGJpLmRhdGEubXAuZG1hMjsKKwkJcy0+cHR0X291dC5zZXJpb2Jhc2UgPSBiaS5kYXRhLm1wLnNlcmlvYmFzZTsKKwkJcy0+cHR0X291dC5wYXJpb2Jhc2UgPSBiaS5kYXRhLm1wLnBhcmlvYmFzZTsKKwkJcy0+cHR0X291dC5taWRpaW9iYXNlID0gYmkuZGF0YS5tcC5taWRpaW9iYXNlOworCQlyZXR1cm4gMDsJCisJCisJY2FzZSBIRExDRFJWQ1RMX0dFVFNUQVQ6CisJCWJpLmRhdGEuY3MucHR0ID0gaGRsY2Rydl9wdHQocyk7CisJCWJpLmRhdGEuY3MuZGNkID0gcy0+aGRsY3J4LmRjZDsKKwkJYmkuZGF0YS5jcy5wdHRfa2V5ZWQgPSBzLT5wdHRfa2V5ZWQ7CisJCWJpLmRhdGEuY3MudHhfcGFja2V0cyA9IHMtPnN0YXRzLnR4X3BhY2tldHM7CisJCWJpLmRhdGEuY3MudHhfZXJyb3JzID0gcy0+c3RhdHMudHhfZXJyb3JzOworCQliaS5kYXRhLmNzLnJ4X3BhY2tldHMgPSBzLT5zdGF0cy5yeF9wYWNrZXRzOworCQliaS5kYXRhLmNzLnJ4X2Vycm9ycyA9IHMtPnN0YXRzLnJ4X2Vycm9yczsKKwkJYnJlYWs7CQkKKworCWNhc2UgSERMQ0RSVkNUTF9PTERHRVRTVEFUOgorCQliaS5kYXRhLm9jcy5wdHQgPSBoZGxjZHJ2X3B0dChzKTsKKwkJYmkuZGF0YS5vY3MuZGNkID0gcy0+aGRsY3J4LmRjZDsKKwkJYmkuZGF0YS5vY3MucHR0X2tleWVkID0gcy0+cHR0X2tleWVkOworCQlicmVhazsJCQorCisJY2FzZSBIRExDRFJWQ1RMX0NBTElCUkFURToKKwkJaWYoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQlyZXR1cm4gLUVQRVJNOworCQlzLT5oZGxjdHguY2FsaWJyYXRlID0gYmkuZGF0YS5jYWxpYnJhdGUgKiBzLT5wYXIuYml0cmF0ZSAvIDE2OworCQlyZXR1cm4gMDsKKworCWNhc2UgSERMQ0RSVkNUTF9HRVRTQU1QTEVTOgorI2lmbmRlZiBIRExDRFJWX0RFQlVHCisJCXJldHVybiAtRVBFUk07CisjZWxzZSAvKiBIRExDRFJWX0RFQlVHICovCisJCWlmIChzLT5iaXRidWZfY2hhbm5lbC5yZCA9PSBzLT5iaXRidWZfY2hhbm5lbC53cikgCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJYmkuZGF0YS5iaXRzID0gCisJCQlzLT5iaXRidWZfY2hhbm5lbC5idWZmZXJbcy0+Yml0YnVmX2NoYW5uZWwucmRdOworCQlzLT5iaXRidWZfY2hhbm5lbC5yZCA9IChzLT5iaXRidWZfY2hhbm5lbC5yZCsxKSAlCisJCQlzaXplb2Yocy0+Yml0YnVmX2NoYW5uZWwuYnVmZmVyKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogSERMQ0RSVl9ERUJVRyAqLworCQkJCQorCWNhc2UgSERMQ0RSVkNUTF9HRVRCSVRTOgorI2lmbmRlZiBIRExDRFJWX0RFQlVHCisJCXJldHVybiAtRVBFUk07CisjZWxzZSAvKiBIRExDRFJWX0RFQlVHICovCisJCWlmIChzLT5iaXRidWZfaGRsYy5yZCA9PSBzLT5iaXRidWZfaGRsYy53cikgCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJYmkuZGF0YS5iaXRzID0gCisJCQlzLT5iaXRidWZfaGRsYy5idWZmZXJbcy0+Yml0YnVmX2hkbGMucmRdOworCQlzLT5iaXRidWZfaGRsYy5yZCA9IChzLT5iaXRidWZfaGRsYy5yZCsxKSAlCisJCQlzaXplb2Yocy0+Yml0YnVmX2hkbGMuYnVmZmVyKTsKKwkJYnJlYWs7CQkKKyNlbmRpZiAvKiBIRExDRFJWX0RFQlVHICovCisKKwljYXNlIEhETENEUlZDVExfRFJJVkVSTkFNRToKKwkJaWYgKHMtPm9wcyAmJiBzLT5vcHMtPmRydm5hbWUpIHsKKwkJCXN0cm5jcHkoYmkuZGF0YS5kcml2ZXJuYW1lLCBzLT5vcHMtPmRydm5hbWUsIAorCQkJCXNpemVvZihiaS5kYXRhLmRyaXZlcm5hbWUpKTsKKwkJCWJyZWFrOworCQl9CisJCWJpLmRhdGEuZHJpdmVybmFtZVswXSA9ICdcMCc7CisJCWJyZWFrOworCQkKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmYmksIHNpemVvZihiaSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEluaXRpYWxpemUgZmllbGRzIGluIGhkbGNkcnYKKyAqLworc3RhdGljIHZvaWQgaGRsY2Rydl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRsY2Rydl9jaGFubmVsX3BhcmFtcyBkZmx0X2NoX3BhcmFtcyA9IHsgCisJCTIwLCAyLCAxMCwgNDAsIDAgCisJfTsKKwlzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcyA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGhlIGhkbGNkcnZfc3RhdGUgc3RydWN0CisJICovCisJcy0+Y2hfcGFyYW1zID0gZGZsdF9jaF9wYXJhbXM7CisJcy0+cHR0X2tleWVkID0gMDsKKworCXNwaW5fbG9ja19pbml0KCZzLT5oZGxjcnguaGJ1Zi5sb2NrKTsKKwlzLT5oZGxjcnguaGJ1Zi5yZCA9IHMtPmhkbGNyeC5oYnVmLndyID0gMDsKKwlzLT5oZGxjcnguaW5faGRsY19yeCA9IDA7CisJcy0+aGRsY3J4LnJ4X3N0YXRlID0gMDsKKwkKKwlzcGluX2xvY2tfaW5pdCgmcy0+aGRsY3R4LmhidWYubG9jayk7CisJcy0+aGRsY3R4LmhidWYucmQgPSBzLT5oZGxjdHguaGJ1Zi53ciA9IDA7CisJcy0+aGRsY3R4LmluX2hkbGNfdHggPSAwOworCXMtPmhkbGN0eC50eF9zdGF0ZSA9IDE7CisJcy0+aGRsY3R4Lm51bWZsYWdzID0gMDsKKwlzLT5oZGxjdHguYml0c3RyZWFtID0gcy0+aGRsY3R4LmJpdGJ1ZiA9IHMtPmhkbGN0eC5udW1iaXRzID0gMDsKKwlzLT5oZGxjdHgucHR0ID0gMDsKKwlzLT5oZGxjdHguc2xvdGNudCA9IHMtPmNoX3BhcmFtcy5zbG90dGltZTsKKwlzLT5oZGxjdHguY2FsaWJyYXRlID0gMDsKKworI2lmZGVmIEhETENEUlZfREVCVUcKKwlzLT5iaXRidWZfY2hhbm5lbC5yZCA9IHMtPmJpdGJ1Zl9jaGFubmVsLndyID0gMDsKKwlzLT5iaXRidWZfY2hhbm5lbC5zaHJlZyA9IDB4ODA7CisKKwlzLT5iaXRidWZfaGRsYy5yZCA9IHMtPmJpdGJ1Zl9oZGxjLndyID0gMDsKKwlzLT5iaXRidWZfaGRsYy5zaHJlZyA9IDB4ODA7CisjZW5kaWYgLyogSERMQ0RSVl9ERUJVRyAqLworCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0CisJICovCisJZGV2LT5vcGVuID0gaGRsY2Rydl9vcGVuOworCWRldi0+c3RvcCA9IGhkbGNkcnZfY2xvc2U7CisJZGV2LT5kb19pb2N0bCA9IGhkbGNkcnZfaW9jdGw7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBoZGxjZHJ2X3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzID0gaGRsY2Rydl9nZXRfc3RhdHM7CisKKwkvKiBGaWxsIGluIHRoZSBmaWVsZHMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKworCXMtPnNrYiA9IE5VTEw7CisJCisjaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisJZGV2LT5oYXJkX2hlYWRlciA9IGF4MjVfZW5jYXBzdWxhdGU7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IGF4MjVfcmVidWlsZF9oZWFkZXI7CisjZWxzZSAvKiBDT05GSUdfQVgyNSB8fCBDT05GSUdfQVgyNV9NT0RVTEUgKi8KKwlkZXYtPmhhcmRfaGVhZGVyID0gTlVMTDsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyID0gTlVMTDsKKyNlbmRpZiAvKiBDT05GSUdfQVgyNSB8fCBDT05GSUdfQVgyNV9NT0RVTEUgKi8KKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGhkbGNkcnZfc2V0X21hY19hZGRyZXNzOworCQorCWRldi0+dHlwZSA9IEFSUEhSRF9BWDI1OyAgICAgICAgICAgLyogQUZfQVgyNSBkZXZpY2UgKi8KKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IEFYMjVfTUFYX0hFQURFUl9MRU4gKyBBWDI1X0JQUV9IRUFERVJfTEVOOworCWRldi0+bXR1ID0gQVgyNV9ERUZfUEFDTEVOOyAgICAgICAgLyogZXRoX210dSBpcyB0aGUgZGVmYXVsdCAqLworCWRldi0+YWRkcl9sZW4gPSBBWDI1X0FERFJfTEVOOyAgICAgLyogc2l6ZW9mIGFuIGF4LjI1IGFkZHJlc3MgKi8KKwltZW1jcHkoZGV2LT5icm9hZGNhc3QsIGF4MjVfYmNhc3QsIEFYMjVfQUREUl9MRU4pOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBheDI1X25vY2FsbCwgQVgyNV9BRERSX0xFTik7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSAxNjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdHJ1Y3QgbmV0X2RldmljZSAqaGRsY2Rydl9yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgaGRsY2Rydl9vcHMgKm9wcywKKwkJCQkgICAgdW5zaWduZWQgaW50IHByaXZzaXplLCBjb25zdCBjaGFyICppZm5hbWUsCisJCQkJICAgIHVuc2lnbmVkIGludCBiYXNlYWRkciwgdW5zaWduZWQgaW50IGlycSwgCisJCQkJICAgIHVuc2lnbmVkIGludCBkbWEpIAoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgKnM7CisJaW50IGVycjsKKworCUJVR19PTihvcHMgPT0gTlVMTCk7CisKKwlpZiAocHJpdnNpemUgPCBzaXplb2Yoc3RydWN0IGhkbGNkcnZfc3RhdGUpKQorCQlwcml2c2l6ZSA9IHNpemVvZihzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSk7CisKKwlkZXYgPSBhbGxvY19uZXRkZXYocHJpdnNpemUsIGlmbmFtZSwgaGRsY2Rydl9zZXR1cCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJLyoKKwkgKiBpbml0aWFsaXplIHBhcnQgb2YgdGhlIGhkbGNkcnZfc3RhdGUgc3RydWN0CisJICovCisJcyA9IG5ldGRldl9wcml2KGRldik7CisJcy0+bWFnaWMgPSBIRExDRFJWX01BR0lDOworCXMtPm9wcyA9IG9wczsKKwlkZXYtPmJhc2VfYWRkciA9IGJhc2VhZGRyOworCWRldi0+aXJxID0gaXJxOworCWRldi0+ZG1hID0gZG1hOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGRsY2RydjogY2Fubm90IHJlZ2lzdGVyIG5ldCAiCisJCSAgICAgICAiZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCQlmcmVlX25ldGRldihkZXYpOworCQlkZXYgPSBFUlJfUFRSKGVycik7CisJfQorCXJldHVybiBkZXY7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGhkbGNkcnZfdW5yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcyA9IG5ldGRldl9wcml2KGRldik7CisKKwlCVUdfT04ocy0+bWFnaWMgIT0gSERMQ0RSVl9NQUdJQyk7CisKKwlpZiAocy0+b3BlbmVkICYmIHMtPm9wcy0+Y2xvc2UpCisJCXMtPm9wcy0+Y2xvc2UoZGV2KTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQorCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitFWFBPUlRfU1lNQk9MKGhkbGNkcnZfcmVjZWl2ZXIpOworRVhQT1JUX1NZTUJPTChoZGxjZHJ2X3RyYW5zbWl0dGVyKTsKK0VYUE9SVF9TWU1CT0woaGRsY2Rydl9hcmJpdHJhdGUpOworRVhQT1JUX1NZTUJPTChoZGxjZHJ2X3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woaGRsY2Rydl91bnJlZ2lzdGVyKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGhkbGNkcnZfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJoZGxjZHJ2OiAoQykgMTk5Ni0yMDAwIFRob21hcyBTYWlsZXIgSEI5Sk5YL0FFNFdBXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJoZGxjZHJ2OiB2ZXJzaW9uIDAuOCBjb21waWxlZCAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoZGxjZHJ2X2NsZWFudXBfZHJpdmVyKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiaGRsY2RydjogY2xlYW51cFxuIik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgTS4gU2FpbGVyLCBzYWlsZXJAaWZlLmVlLmV0aHouY2gsIGhiOWpueEBoYjl3LmNoZS5ldSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQYWNrZXQgUmFkaW8gbmV0d29yayBpbnRlcmZhY2UgSERMQyBlbmNvZGVyL2RlY29kZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGhkbGNkcnZfaW5pdF9kcml2ZXIpOworbW9kdWxlX2V4aXQoaGRsY2Rydl9jbGVhbnVwX2RyaXZlcik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllYTA4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKQEAgLTAsMCArMSw5NTEgQEAKKy8qCisgKglNS0lTUyBEcml2ZXIKKyAqCisgKglUaGlzIG1vZHVsZToKKyAqCQlUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogCQlUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBBWC4yNSBwcm90b2NvbCBmb3Iga2VybmVsLWJhc2VkCisgKgkJZGV2aWNlcyBsaWtlIFRUWXMuIEl0IGludGVyZmFjZXMgYmV0d2VlbiBhIHJhdyBUVFksIGFuZCB0aGUKKyAqCQlrZXJuZWwncyBBWC4yNSBwcm90b2NvbCBsYXllcnMsIGp1c3QgbGlrZSBzbGlwLmMuCisgKgkJQVguMjUgbmVlZHMgdG8gYmUgc2VwYXJhdGVkIGZyb20gc2xpcC5jIHdoaWxlIHNsaXAuYyBpcyBubworICoJCWxvbmdlciBhIHN0YXRpYyBrZXJuZWwgZGV2aWNlIHNpbmNlIGl0IGlzIGEgbW9kdWxlLgorICoJCVRoaXMgbWV0aG9kIGNsZWFycyB0aGUgd2F5IHRvIGltcGxlbWVudCBvdGhlciBraXNzIHByb3RvY29scworICoJCWxpa2UgbWtpc3Mgc21hY2sgZzhicHEgLi4uLi4gc28gZmFyIG9ubHkgbWtpc3MgaXMgaW1wbGVtZW50ZWQuCisgKgorICogSGFucyBBbGJsYXMgPGhhbnNAZXNyYWMuZWxlLnR1ZS5ubD4KKyAqCisgKglIaXN0b3J5CisgKglKb25hdGhhbiAoRzRLTFgpCUZpeGVkIHRvIG1hdGNoIExpbnV4IG5ldHdvcmtpbmcgY2hhbmdlcyAtIDIuMS4xNS4KKyAqCU1hdHRoaWFzIChERzJGRUYpICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIEZsZXhOZXQgQ1JDIChvbiBzcGVjaWFsIHJlcXVlc3QpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiBheDI1X2Nsb3NlKCk6IGRldl9sb2NrX3dhaXQoKSB3YXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIHR3aWNlLCBjYXVzaW5nIGEgZGVhZGxvY2suCisgKglKZXJvZW4gKFBFMVJYUSkJCVJlbW92ZWQgb2xkIE1LSVNTX01BR0lDIHN0dWZmIGFuZCBjYWxscyB0bworICoJCQkJTU9EXypfVVNFX0NPVU5UCisgKgkJCQlSZW1vdmUgY2xpKCkgYW5kIGZpeCBydG5sIGxvY2sgdXNhZ2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorCisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKworI2luY2x1ZGUgIm1raXNzLmgiCisKKyNpZmRlZiBDT05GSUdfSU5FVAorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjZW5kaWYKKworc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAibWtpc3M6IEFYLjI1IE11bHRpa2lzcywgSGFucyBBbGJhcyBQRTFBWVhcbiI7CisKK3R5cGVkZWYgc3RydWN0IGF4MjVfY3RybCB7CisJc3RydWN0IGF4X2Rpc3AgY3RybDsJLyogCQkJCSovCisJc3RydWN0IG5ldF9kZXZpY2UgIGRldjsJLyogdGhlIGRldmljZQkJCSovCit9IGF4MjVfY3RybF90OworCitzdGF0aWMgYXgyNV9jdHJsX3QgKipheDI1X2N0cmxzOworCitpbnQgYXgyNV9tYXhkZXYgPSBBWDI1X01BWERFVjsJCS8qIENhbiBiZSBvdmVycmlkZGVuIHdpdGggaW5zbW9kISAqLworCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYwlheF9sZGlzYzsKKworc3RhdGljIGludCBheDI1X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGtpc3NfZXNjKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBraXNzX2VzY19jcmModW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIHNob3J0LCBpbnQpOworc3RhdGljIHZvaWQga2lzc191bmVzYyhzdHJ1Y3QgYXhfZGlzcCAqLCB1bnNpZ25lZCBjaGFyKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgQ3JjX2ZsZXhfdGFibGVbXSA9IHsKKyAgMHgwZjg3LCAweDFlMGUsIDB4MmM5NSwgMHgzZDFjLCAweDQ5YTMsIDB4NTgyYSwgMHg2YWIxLCAweDdiMzgsCisgIDB4ODNjZiwgMHg5MjQ2LCAweGEwZGQsIDB4YjE1NCwgMHhjNWViLCAweGQ0NjIsIDB4ZTZmOSwgMHhmNzcwLAorICAweDFmMDYsIDB4MGU4ZiwgMHgzYzE0LCAweDJkOWQsIDB4NTkyMiwgMHg0OGFiLCAweDdhMzAsIDB4NmJiOSwKKyAgMHg5MzRlLCAweDgyYzcsIDB4YjA1YywgMHhhMWQ1LCAweGQ1NmEsIDB4YzRlMywgMHhmNjc4LCAweGU3ZjEsCisgIDB4MmU4NSwgMHgzZjBjLCAweDBkOTcsIDB4MWMxZSwgMHg2OGExLCAweDc5MjgsIDB4NGJiMywgMHg1YTNhLAorICAweGEyY2QsIDB4YjM0NCwgMHg4MWRmLCAweDkwNTYsIDB4ZTRlOSwgMHhmNTYwLCAweGM3ZmIsIDB4ZDY3MiwKKyAgMHgzZTA0LCAweDJmOGQsIDB4MWQxNiwgMHgwYzlmLCAweDc4MjAsIDB4NjlhOSwgMHg1YjMyLCAweDRhYmIsCisgIDB4YjI0YywgMHhhM2M1LCAweDkxNWUsIDB4ODBkNywgMHhmNDY4LCAweGU1ZTEsIDB4ZDc3YSwgMHhjNmYzLAorICAweDRkODMsIDB4NWMwYSwgMHg2ZTkxLCAweDdmMTgsIDB4MGJhNywgMHgxYTJlLCAweDI4YjUsIDB4MzkzYywKKyAgMHhjMWNiLCAweGQwNDIsIDB4ZTJkOSwgMHhmMzUwLCAweDg3ZWYsIDB4OTY2NiwgMHhhNGZkLCAweGI1NzQsCisgIDB4NWQwMiwgMHg0YzhiLCAweDdlMTAsIDB4NmY5OSwgMHgxYjI2LCAweDBhYWYsIDB4MzgzNCwgMHgyOWJkLAorICAweGQxNGEsIDB4YzBjMywgMHhmMjU4LCAweGUzZDEsIDB4OTc2ZSwgMHg4NmU3LCAweGI0N2MsIDB4YTVmNSwKKyAgMHg2YzgxLCAweDdkMDgsIDB4NGY5MywgMHg1ZTFhLCAweDJhYTUsIDB4M2IyYywgMHgwOWI3LCAweDE4M2UsCisgIDB4ZTBjOSwgMHhmMTQwLCAweGMzZGIsIDB4ZDI1MiwgMHhhNmVkLCAweGI3NjQsIDB4ODVmZiwgMHg5NDc2LAorICAweDdjMDAsIDB4NmQ4OSwgMHg1ZjEyLCAweDRlOWIsIDB4M2EyNCwgMHgyYmFkLCAweDE5MzYsIDB4MDhiZiwKKyAgMHhmMDQ4LCAweGUxYzEsIDB4ZDM1YSwgMHhjMmQzLCAweGI2NmMsIDB4YTdlNSwgMHg5NTdlLCAweDg0ZjcsCisgIDB4OGI4ZiwgMHg5YTA2LCAweGE4OWQsIDB4YjkxNCwgMHhjZGFiLCAweGRjMjIsIDB4ZWViOSwgMHhmZjMwLAorICAweDA3YzcsIDB4MTY0ZSwgMHgyNGQ1LCAweDM1NWMsIDB4NDFlMywgMHg1MDZhLCAweDYyZjEsIDB4NzM3OCwKKyAgMHg5YjBlLCAweDhhODcsIDB4YjgxYywgMHhhOTk1LCAweGRkMmEsIDB4Y2NhMywgMHhmZTM4LCAweGVmYjEsCisgIDB4MTc0NiwgMHgwNmNmLCAweDM0NTQsIDB4MjVkZCwgMHg1MTYyLCAweDQwZWIsIDB4NzI3MCwgMHg2M2Y5LAorICAweGFhOGQsIDB4YmIwNCwgMHg4OTlmLCAweDk4MTYsIDB4ZWNhOSwgMHhmZDIwLCAweGNmYmIsIDB4ZGUzMiwKKyAgMHgyNmM1LCAweDM3NGMsIDB4MDVkNywgMHgxNDVlLCAweDYwZTEsIDB4NzE2OCwgMHg0M2YzLCAweDUyN2EsCisgIDB4YmEwYywgMHhhYjg1LCAweDk5MWUsIDB4ODg5NywgMHhmYzI4LCAweGVkYTEsIDB4ZGYzYSwgMHhjZWIzLAorICAweDM2NDQsIDB4MjdjZCwgMHgxNTU2LCAweDA0ZGYsIDB4NzA2MCwgMHg2MWU5LCAweDUzNzIsIDB4NDJmYiwKKyAgMHhjOThiLCAweGQ4MDIsIDB4ZWE5OSwgMHhmYjEwLCAweDhmYWYsIDB4OWUyNiwgMHhhY2JkLCAweGJkMzQsCisgIDB4NDVjMywgMHg1NDRhLCAweDY2ZDEsIDB4Nzc1OCwgMHgwM2U3LCAweDEyNmUsIDB4MjBmNSwgMHgzMTdjLAorICAweGQ5MGEsIDB4Yzg4MywgMHhmYTE4LCAweGViOTEsIDB4OWYyZSwgMHg4ZWE3LCAweGJjM2MsIDB4YWRiNSwKKyAgMHg1NTQyLCAweDQ0Y2IsIDB4NzY1MCwgMHg2N2Q5LCAweDEzNjYsIDB4MDJlZiwgMHgzMDc0LCAweDIxZmQsCisgIDB4ZTg4OSwgMHhmOTAwLCAweGNiOWIsIDB4ZGExMiwgMHhhZWFkLCAweGJmMjQsIDB4OGRiZiwgMHg5YzM2LAorICAweDY0YzEsIDB4NzU0OCwgMHg0N2QzLCAweDU2NWEsIDB4MjJlNSwgMHgzMzZjLCAweDAxZjcsIDB4MTA3ZSwKKyAgMHhmODA4LCAweGU5ODEsIDB4ZGIxYSwgMHhjYTkzLCAweGJlMmMsIDB4YWZhNSwgMHg5ZDNlLCAweDhjYjcsCisgIDB4NzQ0MCwgMHg2NWM5LCAweDU3NTIsIDB4NDZkYiwgMHgzMjY0LCAweDIzZWQsIDB4MTE3NiwgMHgwMGZmCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjYWxjX2NyY19mbGV4KHVuc2lnbmVkIGNoYXIgKmNwLCBpbnQgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBjcmMgPSAweGZmZmY7CisgICAgCisgICAgd2hpbGUgKHNpemUtLSkKKwljcmMgPSAoY3JjIDw8IDgpIF4gQ3JjX2ZsZXhfdGFibGVbKChjcmMgPj4gOCkgXiAqY3ArKykgJiAweGZmXTsKKworICAgIHJldHVybiBjcmM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBjaGVja19jcmNfZmxleCh1bnNpZ25lZCBjaGFyICpjcCwgaW50IHNpemUpCit7CisgIHVuc2lnbmVkIHNob3J0IGNyYyA9IDB4ZmZmZjsKKworICBpZiAoc2l6ZSA8IDMpCisgICAgICByZXR1cm4gLTE7CisKKyAgd2hpbGUgKHNpemUtLSkKKyAgICAgIGNyYyA9IChjcmMgPDwgOCkgXiBDcmNfZmxleF90YWJsZVsoKGNyYyA+PiA4KSBeICpjcCsrKSAmIDB4ZmZdOworCisgIGlmICgoY3JjICYgMHhmZmZmKSAhPSAweDcwNzApIAorICAgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZpbmQgYSBmcmVlIGNoYW5uZWwsIGFuZCBsaW5rIGluIHRoaXMgYHR0eScgbGluZS4gKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF4X2Rpc3AgKmF4X2FsbG9jKHZvaWQpCit7CisJYXgyNV9jdHJsX3QgKmF4cD1OVUxMOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGF4MjVfbWF4ZGV2OyBpKyspIHsKKwkJYXhwID0gYXgyNV9jdHJsc1tpXTsKKworCQkvKiBOb3QgYWxsb2NhdGVkID8gKi8KKwkJaWYgKGF4cCA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJLyogTm90IGluIHVzZSA/ICovCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChBWEZfSU5VU0UsICZheHAtPmN0cmwuZmxhZ3MpKQorCQkJYnJlYWs7CisJfQorCisJLyogU29ycnksIHRvbyBtYW55LCBhbGwgc2xvdHMgaW4gdXNlICovCisJaWYgKGkgPj0gYXgyNV9tYXhkZXYpCisJCXJldHVybiBOVUxMOworCisJLyogSWYgbm8gY2hhbm5lbHMgYXJlIGF2YWlsYWJsZSwgYWxsb2NhdGUgb25lICovCisJaWYgKGF4cCA9PSBOVUxMICYmIChheDI1X2N0cmxzW2ldID0ga21hbGxvYyhzaXplb2YoYXgyNV9jdHJsX3QpLCBHRlBfS0VSTkVMKSkgIT0gTlVMTCkgeworCQlheHAgPSBheDI1X2N0cmxzW2ldOworCX0KKwltZW1zZXQoYXhwLCAwLCBzaXplb2YoYXgyNV9jdHJsX3QpKTsKKworCS8qIEluaXRpYWxpemUgY2hhbm5lbCBjb250cm9sIGRhdGEgKi8KKwlzZXRfYml0KEFYRl9JTlVTRSwgJmF4cC0+Y3RybC5mbGFncyk7CisJc3ByaW50ZihheHAtPmRldi5uYW1lLCAiYXglZCIsIGkrKyk7CisJYXhwLT5jdHJsLnR0eSAgICAgID0gTlVMTDsKKwlheHAtPmRldi5iYXNlX2FkZHIgPSBpOworCWF4cC0+ZGV2LnByaXYgICAgICA9ICh2b2lkICopJmF4cC0+Y3RybDsKKwlheHAtPmRldi5uZXh0ICAgICAgPSBOVUxMOworCWF4cC0+ZGV2LmluaXQgICAgICA9IGF4MjVfaW5pdDsKKworCWlmIChheHAgIT0gTlVMTCkgeworCQkvKgorCQkgKiByZWdpc3RlciBkZXZpY2Ugc28gdGhhdCBpdCBjYW4gYmUgaWZjb25maWcnZWQKKwkJICogYXgyNV9pbml0KCkgd2lsbCBiZSBjYWxsZWQgYXMgYSBzaWRlLWVmZmVjdAorCQkgKiBTSURFLUVGRkVDVCBXQVJOSU5HOiBheDI1X2luaXQoKSBDTEVBUlMgYXhwLT5jdHJsICEKKwkJICovCisJCWlmIChyZWdpc3Rlcl9uZXRkZXYoJmF4cC0+ZGV2KSA9PSAwKSB7CisJCQkvKiAoUmUtKVNldCB0aGUgSU5VU0UgYml0LiAgIFZlcnkgSW1wb3J0YW50ISAqLworCQkJc2V0X2JpdChBWEZfSU5VU0UsICZheHAtPmN0cmwuZmxhZ3MpOworCQkJYXhwLT5jdHJsLmRldiA9ICZheHAtPmRldjsKKwkJCWF4cC0+ZGV2LnByaXYgPSAodm9pZCAqKSAmYXhwLT5jdHJsOworCisJCQlyZXR1cm4gJmF4cC0+Y3RybDsKKwkJfSBlbHNlIHsKKwkJCWNsZWFyX2JpdChBWEZfSU5VU0UsJmF4cC0+Y3RybC5mbGFncyk7CisJCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiBheF9hbGxvYygpIC0gcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbHVyZS5cbiIpOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEZyZWUgYW4gQVgyNSBjaGFubmVsLiAqLworc3RhdGljIGlubGluZSB2b2lkIGF4X2ZyZWUoc3RydWN0IGF4X2Rpc3AgKmF4KQoreworCS8qIEZyZWUgYWxsIEFYMjUgZnJhbWUgYnVmZmVycy4gKi8KKwlpZiAoYXgtPnJidWZmKQorCQlrZnJlZShheC0+cmJ1ZmYpOworCWF4LT5yYnVmZiA9IE5VTEw7CisJaWYgKGF4LT54YnVmZikKKwkJa2ZyZWUoYXgtPnhidWZmKTsKKwlheC0+eGJ1ZmYgPSBOVUxMOworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEFYRl9JTlVTRSwgJmF4LT5mbGFncykpCisJCXByaW50ayhLRVJOX0VSUiAibWtpc3M6ICVzOiBheF9mcmVlIGZvciBhbHJlYWR5IGZyZWUgdW5pdC5cbiIsIGF4LT5kZXYtPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBheF9jaGFuZ2VkbXR1KHN0cnVjdCBheF9kaXNwICpheCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYXgtPmRldjsKKwl1bnNpZ25lZCBjaGFyICp4YnVmZiwgKnJidWZmLCAqb3hidWZmLCAqb3JidWZmOworCWludCBsZW47CisKKwlsZW4gPSBkZXYtPm10dSAqIDI7CisKKwkvKgorCSAqIGFsbG93IGZvciBhcnJpdmFsIG9mIGxhcmdlciBVRFAgcGFja2V0cywgZXZlbiBpZiB3ZSBzYXkgbm90IHRvCisJICogYWxzbyBmaXhlcyBhIGJ1ZyBpbiB3aGljaCBTdW5PUyBzZW5kcyA1MTItYnl0ZSBwYWNrZXRzIGV2ZW4gd2l0aAorCSAqIGFuIE1TUyBvZiAxMjgKKwkgKi8KKwlpZiAobGVuIDwgNTc2ICogMikKKwkJbGVuID0gNTc2ICogMjsKKworCXhidWZmID0ga21hbGxvYyhsZW4gKyA0LCBHRlBfQVRPTUlDKTsKKwlyYnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0FUT01JQyk7CisKKwlpZiAoeGJ1ZmYgPT0gTlVMTCB8fCByYnVmZiA9PSBOVUxMKSAgeworCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiAlczogdW5hYmxlIHRvIGdyb3cgYXgyNSBidWZmZXJzLCBNVFUgY2hhbmdlIGNhbmNlbGxlZC5cbiIsCisJCSAgICAgICBheC0+ZGV2LT5uYW1lKTsKKwkJZGV2LT5tdHUgPSBheC0+bXR1OworCQlpZiAoeGJ1ZmYgIT0gTlVMTCkKKwkJCWtmcmVlKHhidWZmKTsKKwkJaWYgKHJidWZmICE9IE5VTEwpCisJCQlrZnJlZShyYnVmZik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfYmgoJmF4LT5idWZsb2NrKTsKKworCW94YnVmZiAgICA9IGF4LT54YnVmZjsKKwlheC0+eGJ1ZmYgPSB4YnVmZjsKKwlvcmJ1ZmYgICAgPSBheC0+cmJ1ZmY7CisJYXgtPnJidWZmID0gcmJ1ZmY7CisKKwlpZiAoYXgtPnhsZWZ0KSB7CisJCWlmIChheC0+eGxlZnQgPD0gbGVuKSB7CisJCQltZW1jcHkoYXgtPnhidWZmLCBheC0+eGhlYWQsIGF4LT54bGVmdCk7CisJCX0gZWxzZSAgeworCQkJYXgtPnhsZWZ0ID0gMDsKKwkJCWF4LT50eF9kcm9wcGVkKys7CisJCX0KKwl9CisKKwlheC0+eGhlYWQgPSBheC0+eGJ1ZmY7CisKKwlpZiAoYXgtPnJjb3VudCkgeworCQlpZiAoYXgtPnJjb3VudCA8PSBsZW4pIHsKKwkJCW1lbWNweShheC0+cmJ1ZmYsIG9yYnVmZiwgYXgtPnJjb3VudCk7CisJCX0gZWxzZSAgeworCQkJYXgtPnJjb3VudCA9IDA7CisJCQlheC0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJCXNldF9iaXQoQVhGX0VSUk9SLCAmYXgtPmZsYWdzKTsKKwkJfQorCX0KKworCWF4LT5tdHUgICAgICA9IGRldi0+bXR1ICsgNzM7CisJYXgtPmJ1ZmZzaXplID0gbGVuOworCisJc3Bpbl91bmxvY2tfYmgoJmF4LT5idWZsb2NrKTsKKworCWlmIChveGJ1ZmYgIT0gTlVMTCkKKwkJa2ZyZWUob3hidWZmKTsKKwlpZiAob3JidWZmICE9IE5VTEwpCisJCWtmcmVlKG9yYnVmZik7Cit9CisKKworLyogU2V0IHRoZSAic2VuZGluZyIgZmxhZy4gIFRoaXMgbXVzdCBiZSBhdG9taWMuICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXhfbG9jayhzdHJ1Y3QgYXhfZGlzcCAqYXgpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShheC0+ZGV2KTsKK30KKworCisvKiBDbGVhciB0aGUgInNlbmRpbmciIGZsYWcuICBUaGlzIG11c3QgYmUgYXRvbWljLiAqLworc3RhdGljIGlubGluZSB2b2lkIGF4X3VubG9jayhzdHJ1Y3QgYXhfZGlzcCAqYXgpCit7CisJbmV0aWZfc3RhcnRfcXVldWUoYXgtPmRldik7Cit9CisKKy8qIFNlbmQgb25lIGNvbXBsZXRlbHkgZGVjYXBzdWxhdGVkIEFYLjI1IHBhY2tldCB0byB0aGUgQVguMjUgbGF5ZXIuICovCitzdGF0aWMgdm9pZCBheF9idW1wKHN0cnVjdCBheF9kaXNwICpheCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBjb3VudDsKKworCXNwaW5fbG9ja19iaCgmYXgtPmJ1ZmxvY2spOworCWlmIChheC0+cmJ1ZmZbMF0gPiAweDBmKSB7CisJCWlmIChheC0+cmJ1ZmZbMF0gJiAweDIwKSB7CisJCSAgICAgICAgYXgtPmNyY21vZGUgPSBDUkNfTU9ERV9GTEVYOworCQkJaWYgKGNoZWNrX2NyY19mbGV4KGF4LT5yYnVmZiwgYXgtPnJjb3VudCkgPCAwKSB7CisJCQkgICAgICAgIGF4LT5yeF9lcnJvcnMrKzsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlheC0+cmNvdW50IC09IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbDlzYXUgYnVnZml4OiB0aGUgdHJhaWxsaW5nIHR3byBieXRlcyBmbGV4bmV0IGNyYworICAgICAgICAgICAgICAgICAgICAgICAgICogd2lsbCBub3QgYmUgcGFzc2VkIHRvIHRoZSBrZXJuZWwuIHRodXMgd2UgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gY29ycmVjdCB0aGUga2lzc3Bhcm0gc2lnbmF0dXJlLCBiZWNhdXNlIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbmRpY2F0ZXMgYSBjcmMgYnV0IHRoZXJlJ3Mgbm9uZQorCQkJICovCisgICAgICAgICAgICAgICAgICAgICAgICAqYXgtPnJidWZmICY9IH4weDIwOworCQl9CisgCX0KKwlzcGluX3VubG9ja19iaCgmYXgtPmJ1ZmxvY2spOworCisJY291bnQgPSBheC0+cmNvdW50OworCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKGNvdW50KSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiAlczogbWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIGF4LT5kZXYtPm5hbWUpOworCQlheC0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJc2tiLT5kZXYgICAgICA9IGF4LT5kZXY7CisJc3Bpbl9sb2NrX2JoKCZheC0+YnVmbG9jayk7CisJbWVtY3B5KHNrYl9wdXQoc2tiLGNvdW50KSwgYXgtPnJidWZmLCBjb3VudCk7CisJc3Bpbl91bmxvY2tfYmgoJmF4LT5idWZsb2NrKTsKKwlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BWDI1KTsKKwluZXRpZl9yeChza2IpOworCWF4LT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCWF4LT5yeF9wYWNrZXRzKys7CisJYXgtPnJ4X2J5dGVzKz1jb3VudDsKK30KKworLyogRW5jYXBzdWxhdGUgb25lIEFYLjI1IHBhY2tldCBhbmQgc3R1ZmYgaW50byBhIFRUWSBxdWV1ZS4gKi8KK3N0YXRpYyB2b2lkIGF4X2VuY2FwcyhzdHJ1Y3QgYXhfZGlzcCAqYXgsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBhY3R1YWwsIGNvdW50OworCisJaWYgKGF4LT5tdHUgIT0gYXgtPmRldi0+bXR1ICsgNzMpCS8qIFNvbWVvbmUgaGFzIGJlZW4gaWZjb25maWdnaW5nICovCisJCWF4X2NoYW5nZWRtdHUoYXgpOworCisJaWYgKGxlbiA+IGF4LT5tdHUpIHsJCS8qIFNpZ2gsIHNob3VsZG4ndCBvY2N1ciBCVVQgLi4uICovCisJCWxlbiA9IGF4LT5tdHU7CisJCXByaW50ayhLRVJOX0VSUiAibWtpc3M6ICVzOiB0cnVuY2F0aW5nIG92ZXJzaXplZCB0cmFuc21pdCBwYWNrZXQhXG4iLCBheC0+ZGV2LT5uYW1lKTsKKwkJYXgtPnR4X2Ryb3BwZWQrKzsKKwkJYXhfdW5sb2NrKGF4KTsKKwkJcmV0dXJuOworCX0KKworCXAgPSBpY3A7CisKKwlzcGluX2xvY2tfYmgoJmF4LT5idWZsb2NrKTsKKyAgICAgICAgc3dpdGNoIChheC0+Y3JjbW9kZSkgeworCSAgICAgICAgIHVuc2lnbmVkIHNob3J0IGNyYzsKKworCWNhc2UgQ1JDX01PREVfRkxFWDoKKwkgICAgICAgICAqcCB8PSAweDIwOworCSAgICAgICAgIGNyYyA9IGNhbGNfY3JjX2ZsZXgocCwgbGVuKTsKKwkJIGNvdW50ID0ga2lzc19lc2NfY3JjKHAsICh1bnNpZ25lZCBjaGFyICopYXgtPnhidWZmLCBjcmMsIGxlbisyKTsKKwkJIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgICAgICBjb3VudCA9IGtpc3NfZXNjKHAsICh1bnNpZ25lZCBjaGFyICopYXgtPnhidWZmLCBsZW4pOworCQkgYnJlYWs7CisJfQorCQorCWF4LT50dHktPmZsYWdzIHw9ICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCWFjdHVhbCA9IGF4LT50dHktPmRyaXZlci0+d3JpdGUoYXgtPnR0eSwgYXgtPnhidWZmLCBjb3VudCk7CisJYXgtPnR4X3BhY2tldHMrKzsKKwlheC0+dHhfYnl0ZXMrPWFjdHVhbDsKKwlheC0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJYXgtPnhsZWZ0ID0gY291bnQgLSBhY3R1YWw7CisJYXgtPnhoZWFkID0gYXgtPnhidWZmICsgYWN0dWFsOworCisJc3Bpbl91bmxvY2tfYmgoJmF4LT5idWZsb2NrKTsKK30KKworLyoKKyAqIENhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gdGhlcmUncyByb29tIGZvciBtb3JlIGRhdGEuICBJZiB3ZSBoYXZlCisgKiBtb3JlIHBhY2tldHMgdG8gc2VuZCwgd2Ugc2VuZCB0aGVtIGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkIGF4MjVfd3JpdGVfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaW50IGFjdHVhbDsKKwlzdHJ1Y3QgYXhfZGlzcCAqYXggPSAoc3RydWN0IGF4X2Rpc3AgKikgdHR5LT5kaXNjX2RhdGE7CisKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkLiAqLworCWlmIChheCA9PSBOVUxMIHx8IGF4LT5tYWdpYyAhPSBBWDI1X01BR0lDIHx8ICFuZXRpZl9ydW5uaW5nKGF4LT5kZXYpKQorCQlyZXR1cm47CisJaWYgKGF4LT54bGVmdCA8PSAwKSAgeworCQkvKiBOb3cgc2VyaWFsIGJ1ZmZlciBpcyBhbG1vc3QgZnJlZSAmIHdlIGNhbiBzdGFydAorCQkgKiB0cmFuc21pc3Npb24gb2YgYW5vdGhlciBwYWNrZXQKKwkJICovCisJCXR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCisJCW5ldGlmX3dha2VfcXVldWUoYXgtPmRldik7CisJCXJldHVybjsKKwl9CisKKwlhY3R1YWwgPSB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBheC0+eGhlYWQsIGF4LT54bGVmdCk7CisJYXgtPnhsZWZ0IC09IGFjdHVhbDsKKwlheC0+eGhlYWQgKz0gYWN0dWFsOworfQorCisvKiBFbmNhcHN1bGF0ZSBhbiBBWC4yNSBwYWNrZXQgYW5kIGtpY2sgaXQgaW50byBhIFRUWSBxdWV1ZS4gKi8KK3N0YXRpYyBpbnQgYXhfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBheF9kaXNwICpheCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJta2lzczogJXM6IHhtaXQgY2FsbCB3aGVuIGlmYWNlIGlzIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJLyoKKwkJICogTWF5IGJlIHdlIG11c3QgY2hlY2sgdHJhbnNtaXR0ZXIgdGltZW91dCBoZXJlID8KKwkJICogICAgICAxNCBPY3QgMTk5NCBEbWl0cnkgR29yb2RjaGFuaW4uCisJCSAqLworCQlpZiAoamlmZmllcyAtIGRldi0+dHJhbnNfc3RhcnQgIDwgMjAgKiBIWikgeworCQkJLyogMjAgc2VjIHRpbWVvdXQgbm90IHJlYWNoZWQgKi8KKwkJCXJldHVybiAxOworCQl9CisKKwkJcHJpbnRrKEtFUk5fRVJSICJta2lzczogJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICAoYXgtPnR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIoYXgtPnR0eSkgfHwgYXgtPnhsZWZ0KSA/CisJCSAgICAgICAiYmFkIGxpbmUgcXVhbGl0eSIgOiAiZHJpdmVyIGVycm9yIik7CisKKwkJYXgtPnhsZWZ0ID0gMDsKKwkJYXgtPnR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCQlheF91bmxvY2soYXgpOworCX0KKworCS8qIFdlIHdlcmUgbm90IGJ1c3ksIHNvIHdlIGFyZSBub3cuLi4gOi0pICovCisJaWYgKHNrYiAhPSBOVUxMKSB7CisJCWF4X2xvY2soYXgpOworCQlheF9lbmNhcHMoYXgsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0FYMjUpIHx8IGRlZmluZWQoQ09ORklHX0FYMjVfTU9EVUxFKQorCisvKiBSZXR1cm4gdGhlIGZyYW1lIHR5cGUgSUQgKi8KK3N0YXRpYyBpbnQgYXhfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHR5cGUsCisJICB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbikKK3sKKyNpZmRlZiBDT05GSUdfSU5FVAorCWlmICh0eXBlICE9IGh0b25zKEVUSF9QX0FYMjUpKQorCQlyZXR1cm4gYXgyNV9lbmNhcHN1bGF0ZShza2IsIGRldiwgdHlwZSwgZGFkZHIsIHNhZGRyLCBsZW4pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBheF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworI2lmZGVmIENPTkZJR19JTkVUCisJcmV0dXJuIGF4MjVfcmVidWlsZF9oZWFkZXIoc2tiKTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworI2VuZGlmCS8qIENPTkZJR197QVgyNSxBWDI1X01PRFVMRX0gKi8KKworLyogT3BlbiB0aGUgbG93LWxldmVsIHBhcnQgb2YgdGhlIEFYMjUgY2hhbm5lbC4gRWFzeSEgKi8KK3N0YXRpYyBpbnQgYXhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBheF9kaXNwICpheCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBsZW47CisKKwlpZiAoYXgtPnR0eSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIGZyYW1lIGJ1ZmZlcnM6CisJICoKKwkgKiByYnVmZglSZWNlaXZlIGJ1ZmZlci4KKwkgKiB4YnVmZglUcmFuc21pdCBidWZmZXIuCisJICovCisJbGVuID0gZGV2LT5tdHUgKiAyOworCisJLyoKKwkgKiBhbGxvdyBmb3IgYXJyaXZhbCBvZiBsYXJnZXIgVURQIHBhY2tldHMsIGV2ZW4gaWYgd2Ugc2F5IG5vdCB0bworCSAqIGFsc28gZml4ZXMgYSBidWcgaW4gd2hpY2ggU3VuT1Mgc2VuZHMgNTEyLWJ5dGUgcGFja2V0cyBldmVuIHdpdGgKKwkgKiBhbiBNU1Mgb2YgMTI4CisJICovCisJaWYgKGxlbiA8IDU3NiAqIDIpCisJCWxlbiA9IDU3NiAqIDI7CisKKwlpZiAoKGF4LT5yYnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWdvdG8gbm9yYnVmZjsKKworCWlmICgoYXgtPnhidWZmID0ga21hbGxvYyhsZW4gKyA0LCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJZ290byBub3hidWZmOworCisJYXgtPm10dQkgICAgID0gZGV2LT5tdHUgKyA3MzsKKwlheC0+YnVmZnNpemUgPSBsZW47CisJYXgtPnJjb3VudCAgID0gMDsKKwlheC0+eGxlZnQgICAgPSAwOworCisJYXgtPmZsYWdzICAgJj0gKDEgPDwgQVhGX0lOVVNFKTsgICAgICAvKiBDbGVhciBFU0NBUEUgJiBFUlJPUiBmbGFncyAqLworCisJc3Bpbl9sb2NrX2luaXQoJmF4LT5idWZsb2NrKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7CisKK25veGJ1ZmY6CisJa2ZyZWUoYXgtPnJidWZmKTsKKworbm9yYnVmZjoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworCisvKiBDbG9zZSB0aGUgbG93LWxldmVsIHBhcnQgb2YgdGhlIEFYMjUgY2hhbm5lbC4gRWFzeSEgKi8KK3N0YXRpYyBpbnQgYXhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXhfZGlzcCAqYXggPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGF4LT50dHkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWF4LT50dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF4MjVfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDY1NTM2OyAgLyogV2UgY2FuIGhhbmRsZSBhbiBpbmZpbml0ZSBhbW91bnQgb2YgZGF0YS4gOi0pICovCit9CisKKy8qCisgKiBIYW5kbGUgdGhlICdyZWNlaXZlciBkYXRhIHJlYWR5JyBpbnRlcnJ1cHQuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgJ3R0eV9pbycgbW9kdWxlIGluIHRoZSBrZXJuZWwgd2hlbgorICogYSBibG9jayBvZiBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLCB3aGljaCBjYW4gbm93IGJlIGRlY2Fwc3VsYXRlZAorICogYW5kIHNlbnQgb24gdG8gdGhlIEFYLjI1IGxheWVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGF4MjVfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpCit7CisJc3RydWN0IGF4X2Rpc3AgKmF4ID0gKHN0cnVjdCBheF9kaXNwICopIHR0eS0+ZGlzY19kYXRhOworCisJaWYgKGF4ID09IE5VTEwgfHwgYXgtPm1hZ2ljICE9IEFYMjVfTUFHSUMgfHwgIW5ldGlmX3J1bm5pbmcoYXgtPmRldikpCisJCXJldHVybjsKKworCS8qCisJICogQXJnaCEgbXR1IGNoYW5nZSB0aW1lISAtIGNvc3RzIHVzIHRoZSBwYWNrZXQgcGFydCByZWNlaXZlZAorCSAqIGF0IHRoZSBjaGFuZ2UKKwkgKi8KKwlpZiAoYXgtPm10dSAhPSBheC0+ZGV2LT5tdHUgKyA3MykKKwkJYXhfY2hhbmdlZG10dShheCk7CisKKwkvKiBSZWFkIHRoZSBjaGFyYWN0ZXJzIG91dCBvZiB0aGUgYnVmZmVyICovCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJaWYgKGZwICE9IE5VTEwgJiYgKmZwKyspIHsKKwkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChBWEZfRVJST1IsICZheC0+ZmxhZ3MpKQorCQkJCWF4LT5yeF9lcnJvcnMrKzsKKwkJCWNwKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWtpc3NfdW5lc2MoYXgsICpjcCsrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXgyNV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGF4X2Rpc3AgKmF4ID0gKHN0cnVjdCBheF9kaXNwICopIHR0eS0+ZGlzY19kYXRhOworCWludCBlcnI7CisKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgbm90IGFscmVhZHkgY29ubmVjdGVkLiAqLworCWlmIChheCAmJiBheC0+bWFnaWMgPT0gQVgyNV9NQUdJQykKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwkvKiBPSy4gIEZpbmQgYSBmcmVlIEFYMjUgY2hhbm5lbCB0byB1c2UuICovCisJaWYgKChheCA9IGF4X2FsbG9jKCkpID09IE5VTEwpCisJCXJldHVybiAtRU5GSUxFOworCisJYXgtPnR0eSA9IHR0eTsKKwl0dHktPmRpc2NfZGF0YSA9IGF4OworCisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKworCS8qIFJlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncyAqLworCWF4LT5kZXYtPnR5cGUgPSBBUlBIUkRfQVgyNTsKKworCS8qIFBlcmZvcm0gdGhlIGxvdy1sZXZlbCBBWDI1IGluaXRpYWxpemF0aW9uLiAqLworCWlmICgoZXJyID0gYXhfb3BlbihheC0+ZGV2KSkpCisJCXJldHVybiBlcnI7CisKKwkvKiBEb25lLiAgV2UgaGF2ZSBsaW5rZWQgdGhlIFRUWSBsaW5lIHRvIGEgY2hhbm5lbC4gKi8KKwlyZXR1cm4gYXgtPmRldi0+YmFzZV9hZGRyOworfQorCitzdGF0aWMgdm9pZCBheDI1X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGF4X2Rpc3AgKmF4ID0gKHN0cnVjdCBheF9kaXNwICopIHR0eS0+ZGlzY19kYXRhOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4gKi8KKwlpZiAoYXggPT0gTlVMTCB8fCBheC0+bWFnaWMgIT0gQVgyNV9NQUdJQykKKwkJcmV0dXJuOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoYXgtPmRldik7CisKKwl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CisJYXgtPnR0eSAgICAgICAgPSBOVUxMOworCisJYXhfZnJlZShheCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpheF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGF4X2Rpc3AgKmF4ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJc3RhdHMucnhfcGFja2V0cyAgICAgPSBheC0+cnhfcGFja2V0czsKKwlzdGF0cy50eF9wYWNrZXRzICAgICA9IGF4LT50eF9wYWNrZXRzOworCXN0YXRzLnJ4X2J5dGVzCSAgICAgPSBheC0+cnhfYnl0ZXM7CisJc3RhdHMudHhfYnl0ZXMgICAgICAgPSBheC0+dHhfYnl0ZXM7CisJc3RhdHMucnhfZHJvcHBlZCAgICAgPSBheC0+cnhfZHJvcHBlZDsKKwlzdGF0cy50eF9kcm9wcGVkICAgICA9IGF4LT50eF9kcm9wcGVkOworCXN0YXRzLnR4X2Vycm9ycyAgICAgID0gYXgtPnR4X2Vycm9yczsKKwlzdGF0cy5yeF9lcnJvcnMgICAgICA9IGF4LT5yeF9lcnJvcnM7CisJc3RhdHMucnhfb3Zlcl9lcnJvcnMgPSBheC0+cnhfb3Zlcl9lcnJvcnM7CisKKwlyZXR1cm4gJnN0YXRzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJICAgU1RBTkRBUkQgRU5DQVBTVUxBVElPTgkgICAgICAgIAkgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBraXNzX2VzYyh1bnNpZ25lZCBjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IGQ7CisJdW5zaWduZWQgY2hhciBjOworCisJLyoKKwkgKiBTZW5kIGFuIGluaXRpYWwgRU5EIGNoYXJhY3RlciB0byBmbHVzaCBvdXQgYW55CisJICogZGF0YSB0aGF0IG1heSBoYXZlIGFjY3VtdWxhdGVkIGluIHRoZSByZWNlaXZlcgorCSAqIGR1ZSB0byBsaW5lIG5vaXNlLgorCSAqLworCisJKnB0cisrID0gRU5EOworCisJd2hpbGUgKGxlbi0tID4gMCkgeworCQlzd2l0Y2ggKGMgPSAqcysrKSB7CisJCQljYXNlIEVORDoKKwkJCQkqcHRyKysgPSBFU0M7CisJCQkJKnB0cisrID0gRVNDX0VORDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVNDOgorCQkJCSpwdHIrKyA9IEVTQzsKKwkJCQkqcHRyKysgPSBFU0NfRVNDOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkqcHRyKysgPSBjOworCQkJCWJyZWFrOworCQl9CisJfQorCisJKnB0cisrID0gRU5EOworCisJcmV0dXJuIHB0ciAtIGQ7Cit9CisKKy8qCisgKiBNVzoKKyAqIE9LIGl0cyB1Z2x5LCBidXQgdGVsbCBtZSBhIGJldHRlciBzb2x1dGlvbiB3aXRob3V0IGNvcHlpbmcgdGhlCisgKiBwYWNrZXQgdG8gYSB0ZW1wb3JhcnkgYnVmZmVyIDotKQorICovCitzdGF0aWMgaW50IGtpc3NfZXNjX2NyYyh1bnNpZ25lZCBjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpkLCB1bnNpZ25lZCBzaG9ydCBjcmMsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqcHRyID0gZDsKKwl1bnNpZ25lZCBjaGFyIGM9MDsKKworCSpwdHIrKyA9IEVORDsKKwl3aGlsZSAobGVuID4gMCkgeworCQlpZiAobGVuID4gMikgCisJCQljID0gKnMrKzsKKwkJZWxzZSBpZiAobGVuID4gMSkKKwkJCWMgPSBjcmMgPj4gODsKKwkJZWxzZSBpZiAobGVuID4gMCkKKwkJCWMgPSBjcmMgJiAweGZmOworCisJCWxlbi0tOworCisJCXN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9IEVTQzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gRVNDX0VORDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVTQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gRVNDOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSBFU0NfRVNDOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQl9CisJfQorCSpwdHIrKyA9IEVORDsKKwlyZXR1cm4gcHRyIC0gZDsJCQorfQorCitzdGF0aWMgdm9pZCBraXNzX3VuZXNjKHN0cnVjdCBheF9kaXNwICpheCwgdW5zaWduZWQgY2hhciBzKQoreworCXN3aXRjaCAocykgeworCQljYXNlIEVORDoKKwkJCS8qIGRyb3Aga2VlcHRlc3QgYml0ID0gVlNWICovCisJCQlpZiAodGVzdF9iaXQoQVhGX0tFRVBURVNULCAmYXgtPmZsYWdzKSkKKwkJCQljbGVhcl9iaXQoQVhGX0tFRVBURVNULCAmYXgtPmZsYWdzKTsKKworCQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoQVhGX0VSUk9SLCAmYXgtPmZsYWdzKSAmJiAoYXgtPnJjb3VudCA+IDIpKQorCQkJCWF4X2J1bXAoYXgpOworCisJCQljbGVhcl9iaXQoQVhGX0VTQ0FQRSwgJmF4LT5mbGFncyk7CisJCQlheC0+cmNvdW50ID0gMDsKKwkJCXJldHVybjsKKworCQljYXNlIEVTQzoKKwkJCXNldF9iaXQoQVhGX0VTQ0FQRSwgJmF4LT5mbGFncyk7CisJCQlyZXR1cm47CisJCWNhc2UgRVNDX0VTQzoKKwkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQVhGX0VTQ0FQRSwgJmF4LT5mbGFncykpCisJCQkJcyA9IEVTQzsKKwkJCWJyZWFrOworCQljYXNlIEVTQ19FTkQ6CisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFYRl9FU0NBUEUsICZheC0+ZmxhZ3MpKQorCQkJCXMgPSBFTkQ7CisJCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2tfYmgoJmF4LT5idWZsb2NrKTsKKwlpZiAoIXRlc3RfYml0KEFYRl9FUlJPUiwgJmF4LT5mbGFncykpIHsKKwkJaWYgKGF4LT5yY291bnQgPCBheC0+YnVmZnNpemUpIHsKKwkJCWF4LT5yYnVmZltheC0+cmNvdW50KytdID0gczsKKwkJCXNwaW5fdW5sb2NrX2JoKCZheC0+YnVmbG9jayk7CisJCQlyZXR1cm47CisJCX0KKworCQlheC0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJc2V0X2JpdChBWEZfRVJST1IsICZheC0+ZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19iaCgmYXgtPmJ1ZmxvY2spOworfQorCisKK3N0YXRpYyBpbnQgYXhfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgX191c2VyICphZGRyKQoreworCWlmIChjb3B5X2Zyb21fdXNlcihkZXYtPmRldl9hZGRyLCBhZGRyLCBBWDI1X0FERFJfTEVOKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXhfc2V0X2Rldl9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzb2NrYWRkciAqc2EgPSBhZGRyOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNhLT5zYV9kYXRhLCBBWDI1X0FERFJfTEVOKTsKKworCXJldHVybiAwOworfQorCisKKy8qIFBlcmZvcm0gSS9PIGNvbnRyb2wgb24gYW4gYWN0aXZlIGF4MjUgY2hhbm5lbC4gKi8KK3N0YXRpYyBpbnQgYXgyNV9kaXNwX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHZvaWQgKmZpbGUsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGF4X2Rpc3AgKmF4ID0gKHN0cnVjdCBheF9kaXNwICopIHR0eS0+ZGlzY19kYXRhOworCXVuc2lnbmVkIGludCB0bXA7CisKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkLiAqLworCWlmIChheCA9PSBOVUxMIHx8IGF4LT5tYWdpYyAhPSBBWDI1X01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJIAljYXNlIFNJT0NHSUZOQU1FOgorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsIGF4LT5kZXYtPm5hbWUsIHN0cmxlbihheC0+ZGV2LT5uYW1lKSArIDEpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTSU9DR0lGRU5DQVA6CisJCQlyZXR1cm4gcHV0X3VzZXIoNCwgKGludCBfX3VzZXIgKilhcmcpOworCisJCWNhc2UgU0lPQ1NJRkVOQ0FQOgorCQkJaWYgKGdldF91c2VyKHRtcCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYXgtPm1vZGUgPSB0bXA7CisJCQlheC0+ZGV2LT5hZGRyX2xlbiAgICAgICAgPSBBWDI1X0FERFJfTEVOOwkgIC8qIHNpemVvZiBhbiBBWC4yNSBhZGRyICovCisJCQlheC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBBWDI1X0tJU1NfSEVBREVSX0xFTiArIEFYMjVfTUFYX0hFQURFUl9MRU4gKyAzOworCQkJYXgtPmRldi0+dHlwZSAgICAgICAgICAgID0gQVJQSFJEX0FYMjU7CisJCQlyZXR1cm4gMDsKKworCQkgY2FzZSBTSU9DU0lGSFdBRERSOgorCQkJcmV0dXJuIGF4X3NldF9tYWNfYWRkcmVzcyhheC0+ZGV2LCBhcmcpOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RhdGljIGludCBheF9vcGVuX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBheF9kaXNwICpheCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoYXgtPnR0eSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCisKKy8qIEluaXRpYWxpemUgdGhlIGRyaXZlci4gIENhbGxlZCBieSBuZXR3b3JrIHN0YXJ0dXAuICovCitzdGF0aWMgaW50IGF4MjVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBheF9kaXNwICpheCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdGF0aWMgY2hhciBheDI1X2JjYXN0W0FYMjVfQUREUl9MRU5dID0KKwkJeydRJzw8MSwnUyc8PDEsJ1QnPDwxLCcgJzw8MSwnICc8PDEsJyAnPDwxLCcwJzw8MX07CisJc3RhdGljIGNoYXIgYXgyNV90ZXN0W0FYMjVfQUREUl9MRU5dID0KKwkJeydMJzw8MSwnSSc8PDEsJ04nPDwxLCdVJzw8MSwnWCc8PDEsJyAnPDwxLCcxJzw8MX07CisKKwlpZiAoYXggPT0gTlVMTCkJCS8qIEFsbG9jYXRpb24gZmFpbGVkID8/ICovCisJCXJldHVybiAtRU5PREVWOworCisJLyogU2V0IHVwIHRoZSAiQVgyNSBDb250cm9sIEJsb2NrIi4gKEFuZCBjbGVhciBzdGF0aXN0aWNzKSAqLworCW1lbXNldChheCwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXhfZGlzcCkpOworCWF4LT5tYWdpYyAgPSBBWDI1X01BR0lDOworCWF4LT5kZXYJICAgPSBkZXY7CisKKwkvKiBGaW5pc2ggc2V0dGluZyB1cCB0aGUgREVWSUNFIGluZm8uICovCisJZGV2LT5tdHUgICAgICAgICAgICAgPSBBWF9NVFU7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBheF94bWl0OworCWRldi0+b3BlbiAgICAgICAgICAgID0gYXhfb3Blbl9kZXY7CisJZGV2LT5zdG9wICAgICAgICAgICAgPSBheF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cwkgICAgID0gYXhfZ2V0X3N0YXRzOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gYXhfc2V0X2Rldl9tYWNfYWRkcmVzczsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IDA7CisJZGV2LT5hZGRyX2xlbiAgICAgICAgPSAwOworCWRldi0+dHlwZSAgICAgICAgICAgID0gQVJQSFJEX0FYMjU7CisJZGV2LT50eF9xdWV1ZV9sZW4gICAgPSAxMDsKKwlkZXYtPmhhcmRfaGVhZGVyICAgICA9IGF4X2hlYWRlcjsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyICA9IGF4X3JlYnVpbGRfaGVhZGVyOworCisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCBheDI1X2JjYXN0LCBBWDI1X0FERFJfTEVOKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgIGF4MjVfdGVzdCwgIEFYMjVfQUREUl9MRU4pOworCisJLyogTmV3LXN0eWxlIGZsYWdzLiAqLworCWRldi0+ZmxhZ3MgICAgICA9IElGRl9CUk9BRENBU1QgfCBJRkZfTVVMVElDQVNUOworCisJcmV0dXJuIDA7Cit9CisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoJCQlJbml0IE1LSVNTIGRyaXZlcgkJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgX19pbml0IG1raXNzX2luaXRfZHJpdmVyKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCXByaW50ayhiYW5uZXIpOworCisJaWYgKGF4MjVfbWF4ZGV2IDwgNCkKKwkgIGF4MjVfbWF4ZGV2ID0gNDsgLyogU2FuaXR5ICovCisKKwlpZiAoKGF4MjVfY3RybHMgPSBrbWFsbG9jKHNpemVvZih2b2lkICopICogYXgyNV9tYXhkZXYsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWtpc3M6IENhbid0IGFsbG9jYXRlIGF4MjVfY3RybHNbXSBhcnJheSFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBDbGVhciB0aGUgcG9pbnRlciBhcnJheSwgd2UgYWxsb2NhdGUgZGV2aWNlcyB3aGVuIHdlIG5lZWQgdGhlbSAqLworCW1lbXNldChheDI1X2N0cmxzLCAwLCBzaXplb2Yodm9pZCopICogYXgyNV9tYXhkZXYpOyAvKiBQb2ludGVycyAqLworCisJLyogRmlsbCBpbiBvdXIgbGluZSBwcm90b2NvbCBkaXNjaXBsaW5lLCBhbmQgcmVnaXN0ZXIgaXQgKi8KKwlheF9sZGlzYy5tYWdpYwkJPSBUVFlfTERJU0NfTUFHSUM7CisJYXhfbGRpc2MubmFtZQkJPSAibWtpc3MiOworCWF4X2xkaXNjLm9wZW4JCT0gYXgyNV9vcGVuOworCWF4X2xkaXNjLmNsb3NlCQk9IGF4MjVfY2xvc2U7CisJYXhfbGRpc2MuaW9jdGwJCT0gKGludCAoKikoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwKKwkJCQkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKSlheDI1X2Rpc3BfaW9jdGw7CisJYXhfbGRpc2MucmVjZWl2ZV9idWYJPSBheDI1X3JlY2VpdmVfYnVmOworCWF4X2xkaXNjLnJlY2VpdmVfcm9vbQk9IGF4MjVfcmVjZWl2ZV9yb29tOworCWF4X2xkaXNjLndyaXRlX3dha2V1cAk9IGF4MjVfd3JpdGVfd2FrZXVwOworCisJaWYgKChzdGF0dXMgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9BWDI1LCAmYXhfbGRpc2MpKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWtpc3M6IGNhbid0IHJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iLCBzdGF0dXMpOworCQlrZnJlZShheDI1X2N0cmxzKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1raXNzX2V4aXRfZHJpdmVyKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXgyNV9tYXhkZXY7IGkrKykgeworCQlpZiAoYXgyNV9jdHJsc1tpXSkgeworCQkJLyoKKwkJCSogVlNWID0gaWYgZGV2LT5zdGFydD09MCwgdGhlbiBkZXZpY2UKKwkJCSogdW5yZWdpc3RlcmVkIHdoaWxlIGNsb3NlIHByb2MuCisJCQkqLworCQkJaWYgKG5ldGlmX3J1bm5pbmcoJmF4MjVfY3RybHNbaV0tPmRldikpCisJCQkJdW5yZWdpc3Rlcl9uZXRkZXYoJmF4MjVfY3RybHNbaV0tPmRldik7CisJCQlrZnJlZShheDI1X2N0cmxzW2ldKTsKKwkJfQorCX0KKworCWtmcmVlKGF4MjVfY3RybHMpOworCWF4MjVfY3RybHMgPSBOVUxMOworCisJaWYgKChpID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fQVgyNSwgTlVMTCkpKQorCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiBjYW4ndCB1bnJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iLCBpKTsKK30KKworTU9EVUxFX0FVVEhPUigiSGFucyBBbGJhcyBQRTFBWVggPGhhbnNAZXNyYWMuZWxlLnR1ZS5ubD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiS0lTUyBkcml2ZXIgZm9yIEFYLjI1IG92ZXIgVFRZcyIpOworTU9EVUxFX1BBUk0oYXgyNV9tYXhkZXYsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGF4MjVfbWF4ZGV2LCAibnVtYmVyIG9mIE1LSVNTIGRldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19MRElTQyhOX0FYMjUpOworbW9kdWxlX2luaXQobWtpc3NfaW5pdF9kcml2ZXIpOworbW9kdWxlX2V4aXQobWtpc3NfZXhpdF9kcml2ZXIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5oIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWI3MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuaApAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJRGVmaW5lcyBmb3IgdGhlIE11bHRpLUtJU1MgZHJpdmVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQVgyNV9NQVhERVYJMTYJCS8qIE1BWCBudW1iZXIgb2YgQVgyNSBjaGFubmVsczsKKwkJCQkJICAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoCisJCQkJCSAgIGluc21vZCAtb2F4MjVfbWF4ZGV2PW5ubgkqLworI2RlZmluZSBBWF9NVFUJCTIzNgkKKworLyogU0xJUC9LSVNTIHByb3RvY29sIGNoYXJhY3RlcnMuICovCisjZGVmaW5lIEVORCAgICAgICAgICAgICAwMzAwCQkvKiBpbmRpY2F0ZXMgZW5kIG9mIGZyYW1lCSovCisjZGVmaW5lIEVTQyAgICAgICAgICAgICAwMzMzCQkvKiBpbmRpY2F0ZXMgYnl0ZSBzdHVmZmluZwkqLworI2RlZmluZSBFU0NfRU5EICAgICAgICAgMDMzNAkJLyogRVNDIEVTQ19FTkQgbWVhbnMgRU5EICdkYXRhJwkqLworI2RlZmluZSBFU0NfRVNDICAgICAgICAgMDMzNQkJLyogRVNDIEVTQ19FU0MgbWVhbnMgRVNDICdkYXRhJwkqLworCitzdHJ1Y3QgYXhfZGlzcCB7CisJaW50ICAgICAgICAgICAgICAgIG1hZ2ljOworCisJLyogVmFyaW91cyBmaWVsZHMuICovCisJc3RydWN0IHR0eV9zdHJ1Y3QgICp0dHk7CQkvKiBwdHIgdG8gVFRZIHN0cnVjdHVyZQkJKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICpkZXY7CQkvKiBlYXN5IGZvciBpbnRyIGhhbmRsaW5nCSovCisKKwkvKiBUaGVzZSBhcmUgcG9pbnRlcnMgdG8gdGhlIG1hbGxvYygpZWQgZnJhbWUgYnVmZmVycy4gKi8KKwl1bnNpZ25lZCBjaGFyICAgICAgKnJidWZmOwkJLyogcmVjZWl2ZXIgYnVmZmVyCQkqLworCWludCAgICAgICAgICAgICAgICByY291bnQ7CQkvKiByZWNlaXZlZCBjaGFycyBjb3VudGVyICAgICAgICovCisJdW5zaWduZWQgY2hhciAgICAgICp4YnVmZjsJCS8qIHRyYW5zbWl0dGVyIGJ1ZmZlcgkJKi8KKwl1bnNpZ25lZCBjaGFyICAgICAgKnhoZWFkOwkJLyogcG9pbnRlciB0byBuZXh0IGJ5dGUgdG8gWE1JVCAqLworCWludCAgICAgICAgICAgICAgICB4bGVmdDsJCS8qIGJ5dGVzIGxlZnQgaW4gWE1JVCBxdWV1ZSAgICAgKi8KKworCS8qIFNMSVAgaW50ZXJmYWNlIHN0YXRpc3RpY3MuICovCisJdW5zaWduZWQgbG9uZyAgICAgIHJ4X3BhY2tldHM7CQkvKiBpbmJvdW5kIGZyYW1lcyBjb3VudGVyCSovCisJdW5zaWduZWQgbG9uZyAgICAgIHR4X3BhY2tldHM7CQkvKiBvdXRib3VuZCBmcmFtZXMgY291bnRlciAgICAgICovCisJdW5zaWduZWQgbG9uZyAgICAgIHJ4X2J5dGVzOwkJLyogaW5ib3VuZCBieXRlcyBjb3VudGVyICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgICAgICB0eF9ieXRlczsJCS8qIG91dGJvdW5kIGJ5dGVzIGNvdW50ZXIgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nICAgICAgcnhfZXJyb3JzOwkJLyogUGFyaXR5LCBldGMuIGVycm9ycyAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgICAgICB0eF9lcnJvcnM7CQkvKiBQbGFubmVkIHN0dWZmICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyAgICAgIHJ4X2Ryb3BwZWQ7CQkvKiBObyBtZW1vcnkgZm9yIHNrYiAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyAgICAgIHR4X2Ryb3BwZWQ7CQkvKiBXaGVuIE1UVSBjaGFuZ2UgICAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyAgICAgIHJ4X292ZXJfZXJyb3JzOwkvKiBGcmFtZSBiaWdnZXIgdGhlbiBTTElQIGJ1Zi4gICovCisKKwkvKiBEZXRhaWxlZCBTTElQIHN0YXRpc3RpY3MuICovCisJaW50ICAgICAgICAgICAgICAgICBtdHU7CQkvKiBPdXIgbXR1ICh0byBzcG90IGNoYW5nZXMhKSAgICovCisJaW50ICAgICAgICAgICAgICAgICBidWZmc2l6ZTsJCS8qIE1heCBidWZmZXJzIHNpemVzICAgICAgICAgICAgKi8KKworCisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOwkJLyogRmxhZyB2YWx1ZXMvIG1vZGUgZXRjCSovCisJCQkJCS8qIGxvbmcgcmVxJ2Q6IHVzZWQgYnkgc2V0X2JpdCAtLVJSICovCisjZGVmaW5lIEFYRl9JTlVTRQkwCQkvKiBDaGFubmVsIGluIHVzZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFYRl9FU0NBUEUJMSAgICAgICAgICAgICAgIC8qIEVTQyByZWNlaXZlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVhGX0VSUk9SCTIgICAgICAgICAgICAgICAvKiBQYXJpdHksIGV0Yy4gZXJyb3IgICAgICAgICAgICovCisjZGVmaW5lIEFYRl9LRUVQVEVTVAkzCQkvKiBLZWVwYWxpdmUgdGVzdCBmbGFnCQkqLworI2RlZmluZSBBWEZfT1VUV0FJVAk0CQkvKiBpcyBvdXRwYWNrZXQgd2FzIGZsYWcJKi8KKworCWludCAgICAgICAgICAgICAgICAgbW9kZTsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICBjcmNtb2RlOyAgICAvKiBNVzogZm9yIEZsZXhOZXQsIFNNQUNLIGV0Yy4gICovIAorI2RlZmluZSBDUkNfTU9ERV9OT05FICAgMAorI2RlZmluZSBDUkNfTU9ERV9GTEVYICAgMQorI2RlZmluZSBDUkNfTU9ERV9TTUFDSyAgMgorCXNwaW5sb2NrX3QgICAgICAgICAgYnVmbG9jazsJLyogbG9jayBmb3IgcmJ1ZiBhbmQgeGJ1ZiAqLworfTsKKworI2RlZmluZSBBWDI1X01BR0lDCQkweDUzMTYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3NjYy5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vc2NjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5ZTdhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3NjYy5jCkBAIC0wLDAgKzEsMjE5MSBAQAorI2RlZmluZSBSQ1NfSUQgIiRJZDogc2NjLmMsdiAxLjc1IDE5OTgvMTEvMDQgMTU6MTU6MDEganJldXRlciBFeHAganJldXRlciAkIgorCisjZGVmaW5lIFZFUlNJT04gIjMuMCIKKworLyoKKyAqIFBsZWFzZSB1c2Ugejg1MzBkcnYtdXRpbHMtMy4wIHdpdGggdGhpcyB2ZXJzaW9uLgorICogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBZb3UgY2FuIGZpbmQgYSBzdWJzZXQgb2YgdGhlIGRvY3VtZW50YXRpb24gaW4gCisgKiBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvejg1MzBkcnYudHh0LgorICovCisKKy8qCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiAgIFNDQy5DIC0gTGludXggZHJpdmVyIGZvciBaODUzMCBiYXNlZCBIRExDIGNhcmRzIGZvciBBWC4yNSAgICAgICoKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCUNvcHlyaWdodCAoYykgMTk5MywgMjAwMCBKb2VyZyBSZXV0ZXIgREwxQktFCisKKwlwb3J0aW9ucyAoYykgMTk5MyBHdWlkbyB0ZW4gRG9sbGUgUEUxTk5aCisKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAKKyAgIFRoZSBkcml2ZXIgYW5kIHRoZSBwcm9ncmFtcyBpbiB0aGUgYXJjaGl2ZSBhcmUgVU5ERVIgQ09OU1RSVUNUSU9OLgorICAgVGhlIGNvZGUgaXMgbGlrZWx5IHRvIGZhaWwsIGFuZCBzbyB5b3VyIGtlcm5lbCBjb3VsZCAtLS0gZXZlbiAKKyAgIGEgd2hvbGUgbmV0d29yay4gCisKKyAgIFRoaXMgZHJpdmVyIGlzIGludGVuZGVkIGZvciBBbWF0ZXVyIFJhZGlvIHVzZS4gSWYgeW91IGFyZSBydW5uaW5nIGl0CisgICBmb3IgY29tbWVyY2lhbCBwdXJwb3NlcywgcGxlYXNlIGRyb3AgbWUgYSBub3RlLiBJIGFtIG5vc3kuLi4KKworICAgLi4uQlVUOgorIAorICAgISBZb3UgIG0gdSBzIHQgIHJlY29nbml6ZSB0aGUgYXBwcm9wcmlhdGUgbGVnaXNsYXRpb25zIG9mIHlvdXIgY291bnRyeSAhCisgICAhIGJlZm9yZSB5b3UgY29ubmVjdCBhIHJhZGlvIHRvIHRoZSBTQ0MgYm9hcmQgYW5kIHN0YXJ0IHRvIHRyYW5zbWl0IG9yICEKKyAgICEgcmVjZWl2ZS4gVGhlIEdQTCBhbGxvd3MgeW91IHRvIHVzZSB0aGUgIGQgciBpIHYgZSByLCAgTk9UIHRoZSBSQURJTyEgIQorCisgICBGb3Igbm9uLUFtYXRldXItUmFkaW8gdXNlIHBsZWFzZSBub3RlIHRoYXQgeW91IG1pZ2h0IG5lZWQgYSBzcGVjaWFsCisgICBhbGxvd2FuY2UvbGljZW5jZSBmcm9tIHRoZSBkZXNpZ25lciBvZiB0aGUgU0NDIEJvYXJkIGFuZC9vciB0aGUKKyAgIE1PREVNLiAKKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgCisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIChtb2RpZmllZCkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgICBkZWxpdmVyZWQgd2l0aCB0aGUgTGludXgga2VybmVsIHNvdXJjZS4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBmaW5kIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW4gCisgICAvdXNyL3NyYy9saW51eC9DT1BZSU5HOyAKKyAgIAorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisKKwkJCisgICBJbmNvbXBsZXRlIGhpc3Rvcnkgb2Ygejg1MzBkcnY6CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDE5OTQtMDktMTMJc3RhcnRlZCB0byB3cml0ZSB0aGUgZHJpdmVyLCByZXNjdWVkIG1vc3Qgb2YgbXkgb3duCisJCWNvZGUgKGFuZCBIYW5zIEFsYmxhcycgbWVtb3J5IGJ1ZmZlciBwb29sIGNvbmNlcHQpIGZyb20gCisJCWFuIGVhcmxpZXIgcHJvamVjdCAic2NjZHJ2IiB3aGljaCB3YXMgaW5pdGlhdGVkIGJ5IAorCQlHdWlkbyB0ZW4gRG9sbGUuIE5vdCBtdWNoIG9mIHRoZSBvbGQgZHJpdmVyIHN1cnZpdmVkLCAKKwkJdGhvdWdoLiBUaGUgZmlyc3QgdmVyc2lvbiBJIHB1dCBteSBoYW5kcyBvbiB3YXMgc2NjZHJ2MS4zCisJCWZyb20gQXVndXN0IDE5OTMuIFRoZSBtZW1vcnkgYnVmZmVyIHBvb2wgY29uY2VwdAorCQlhcHBlYXJlZCBpbiBhbiB1bmF1dGhvcml6ZWQgc2NjZHJ2IHZlcnNpb24gKDEuNSkgZnJvbQorCQlBdWd1c3QgMTk5NC4KKworICAgMTk5NS0wMS0zMQljaGFuZ2VkIGNvcHlyaWdodCBub3RpY2UgdG8gR1BMIHdpdGhvdXQgbGltaXRhdGlvbnMuCisgICAKKyAgICAgLgorICAgICAuCTxTTklQPgorICAgICAuCisgICAJCSAgCisgICAxOTk2LTEwLTA1CU5ldyBzZW1lc3RlciwgbmV3IGRyaXZlci4uLiAKKworICAgCQkgICogS0lTUyBUTkMgZW11bGF0b3IgcmVtb3ZlZCAoVFRZIGRyaXZlcikKKyAgIAkJICAqIFNvdXJjZSBtb3ZlZCB0byBkcml2ZXJzL25ldC8KKyAgIAkJICAqIEluY2x1ZGVzIFo4NTMwIGRlZmluZXMgZnJvbSBkcml2ZXJzL25ldC96ODUzMC5oCisgICAJCSAgKiBVc2VzIHNrX2J1ZmZlciBtZW1vcnkgbWFuYWdlbWVudAorICAgCQkgICogUmVkdWNlZCBvdmVyaGVhZCBvZiAvcHJvYy9uZXQvejg1MzBkcnYgb3V0cHV0CisgICAJCSAgKiBTdHJlYW1saW5lZCBxdWl0ZSBhIGxvdCB0aGluZ3MKKyAgIAkJICAqIEludmVudHMgYnJhbmQgbmV3IGJ1Z3MuLi4gOy0pCisKKyAgIAkJICBUaGUgbW92ZSB0byB2ZXJzaW9uIG51bWJlciAzLjAgcmVmbGVjdHMgdGhlc2VzIGNoYW5nZXMuCisgICAJCSAgWW91IGNhbiB1c2UgJ2tpc3NicmlkZ2UnIGlmIHlvdSBuZWVkIGEgS0lTUyBUTkMgZW11bGF0b3IuCisKKyAgIDE5OTYtMTItMTMJRml4ZWQgZm9yIExpbnV4IG5ldHdvcmtpbmcgY2hhbmdlcy4gKEc0S0xYKQorICAgMTk5Ny0wMS0wOAlGaXhlZCB0aGUgcmVtYWluaW5nIHByb2JsZW1zLgorICAgMTk5Ny0wNC0wMglIb3BlZnVsbHkgZml4ZWQgdGhlIHByb2JsZW1zIHdpdGggdGhlIG5ldyAqX3RpbWVyKCkKKyAgIAkJcm91dGluZXMsIGFkZGVkIGNhbGlicmF0aW9uIGNvZGUuCisgICAxOTk3LTEwLTEyCU1hZGUgU0NDX0RFTEFZIGEgQ09ORklHIG9wdGlvbiwgYWRkZWQgQ09ORklHX1NDQ19UUlhFQ0hPCisgICAxOTk4LTAxLTI5CVNtYWxsIGZpeCB0byBhdm9pZCBsb2NrLXVwIG9uIGluaXRpYWxpemF0aW9uCisgICAxOTk4LTA5LTI5CUZpeGVkIHRoZSAiZ3JvdXBpbmciIGJ1Z3MsIHR4X2luaGliaXQgd29ya3MgYWdhaW4sCisgICAJCXVzaW5nIGRldi0+dHhfcXVldWVfbGVuIG5vdyBpbnN0ZWFkIG9mIE1BWFFVRVVFIG5vdy4KKyAgIDE5OTgtMTAtMjEJUG9zdHBvbmVkIHRoZSBzcGlubG9jayBjaGFuZ2VzLCB3b3VsZCBuZWVkIGEgbG90IG9mCisgICAJCXRlc3RpbmcgSSBjdXJyZW50bHkgZG9uJ3QgaGF2ZSB0aGUgdGltZSB0by4gU29mdGRjZCBkb2Vzbid0CisgICAJCXdvcmsuCisgICAxOTk4LTExLTA0CVNvZnRkY2QgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgaW4gRFBMTCBtb2RlLCBpbiBmYWN0IGl0IAorICAgCQluZXZlciBkaWQuIFRoZSBEUExMIGxvY2tzIG9uIG5vaXNlLCB0aGUgU1lOQyB1bml0IHNlZXMKKyAgIAkJZmxhZ3MgdGhhdCBhcmVuJ3QuLi4gUmVzdGFydGluZyB0aGUgRFBMTCBkb2VzIG5vdCBoZWxwCisgICAJCWVpdGhlciwgaXQgcmVzeW5jaHJvbml6ZXMgdG9vIHNsb3cgYW5kIHRoZSBmaXJzdCByZWNlaXZlZAorICAgCQlmcmFtZSBnZXRzIGxvc3QuCisgICAyMDAwLTAyLTEzCUZpeGVkIGZvciBuZXcgbmV0d29yayBkcml2ZXIgaW50ZXJmYWNlIGNoYW5nZXMsIHN0aWxsCisgICAJCWRvZXMgVFggdGltZW91dHMgaXRzZWxmIHNpbmNlIGl0IHVzZXMgaXRzIG93biBxdWV1ZQorICAgCQlzY2hlbWUuCisKKyAgIFRoYW5rcyB0byBhbGwgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMgZHJpdmVyIHdpdGggaWRlYXMgYW5kIGJ1ZworICAgcmVwb3J0cyEKKyAgIAorICAgTkIgLS0gaWYgeW91IGZpbmQgZXJyb3JzLCBjaGFuZ2Ugc29tZXRoaW5nLCBwbGVhc2UgbGV0IG1lIGtub3cKKyAgICAgIAkgZmlyc3QgYmVmb3JlIHlvdSBkaXN0cmlidXRlIGl0Li4uIEFuZCBwbGVhc2UgZG9uJ3QgdG91Y2gKKyAgIAkgdGhlIHZlcnNpb24gbnVtYmVyLiBKdXN0IHJlcGxhY2UgbXkgY2FsbHNpZ24gaW4KKyAgIAkgInYzLjAuZGwxYmtlIiB3aXRoIHlvdXIgb3duLiBKdXN0IHRvIGF2b2lkIGNvbmZ1c2lvbi4uLgorCisgICBJZiB5b3Ugd2FudCB0byBhZGQgeW91ciBtb2RpZmljYXRpb24gdG8gdGhlIGxpbnV4IGRpc3RyaWJ1dGlvbgorICAgcGxlYXNlICghKSBjb250YWN0IG1lIGZpcnN0LgorICAgCisgICBOZXcgdmVyc2lvbnMgb2YgdGhlIGRyaXZlciB3aWxsIGJlIGFubm91bmNlZCBvbiB0aGUgbGludXgtaGFtcworICAgbWFpbGluZyBsaXN0IG9uIHZnZXIua2VybmVsLm9yZy4gVG8gc3Vic2NyaWJlIHNlbmQgYW4gZS1tYWlsCisgICB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnIHdpdGggdGhlIGZvbGxvd2luZyBsaW5lIGluCisgICB0aGUgYm9keSBvZiB0aGUgbWFpbDoKKyAgIAorCSAgIHN1YnNjcmliZSBsaW51eC1oYW1zCisJICAgCisgICBUaGUgY29udGVudCBvZiB0aGUgIlN1YmplY3QiIGZpZWxkIHdpbGwgYmUgaWdub3JlZC4KKworICAgdnkgNzMsCisgICBKb2VyZyBSZXV0ZXIJYW1wci1uZXQ6IGRsMWJrZUBkYjBwcmEuYW1wci5vcmcKKwkJQVgtMjUgICA6IERMMUJLRSBAIERCMEFCSC4jQkFZLkRFVS5FVQorCQlJbnRlcm5ldDoganJldXRlckB5YWluYS5kZQorCQl3d3cgICAgIDogaHR0cDovL3lhaW5hLmRlL2pyZXV0ZXIKKyovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyN1bmRlZiAgU0NDX0xERUxBWQkJLyogc2xvdyBpdCBldmVuIGEgYml0IG1vcmUgZG93biAqLworI3VuZGVmICBTQ0NfRE9OVF9DSEVDSwkJLyogZG9uJ3QgbG9vayBpZiB0aGUgU0NDcyB5b3Ugc3BlY2lmaWVkIGFyZSBhdmFpbGFibGUgKi8KKworI2RlZmluZSBTQ0NfTUFYQ0hJUFMJNCAgICAgICAvKiBudW1iZXIgb2YgbWF4LiBzdXBwb3J0ZWQgY2hpcHMgKi8KKyNkZWZpbmUgU0NDX0JVRlNJWkUJMzg0ICAgICAvKiBtdXN0IG5vdCBleGNlZWQgNDA5NiAqLworI3VuZGVmCVNDQ19ERUJVRworCisjZGVmaW5lIFNDQ19ERUZBVUxUX0NMT0NLCTQ5MTUyMDAgCisJCQkJLyogZGVmYXVsdCBwY2xvY2sgaWYgbm90aGluZyBpcyBzcGVjaWZpZWQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NjLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJ6ODUzMC5oIgorCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJBWC4yNTogWjg1MzAgU0NDIGRyaXZlciB2ZXJzaW9uICJWRVJTSU9OIi5kbDFia2VcbiI7CisKK3N0YXRpYyB2b2lkIHRfZHdhaXQodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCB0X3R4ZGVsYXkodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCB0X3RhaWwodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCB0X2J1c3kodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCB0X21heGtleXVwKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgdF9pZGxlKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgc2NjX3R4X2RvbmUoc3RydWN0IHNjY19jaGFubmVsICopOworc3RhdGljIHZvaWQgc2NjX3N0YXJ0X3R4X3RpbWVyKHN0cnVjdCBzY2NfY2hhbm5lbCAqLCB2b2lkICgqKSh1bnNpZ25lZCBsb25nKSwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBzY2Nfc3RhcnRfbWF4a2V5dXAoc3RydWN0IHNjY19jaGFubmVsICopOworc3RhdGljIHZvaWQgc2NjX3N0YXJ0X2RlZmVyKHN0cnVjdCBzY2NfY2hhbm5lbCAqKTsKKworc3RhdGljIHZvaWQgejg1MzBfaW5pdCh2b2lkKTsKKworc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKTsKK3N0YXRpYyB2b2lkIHNjY19rZXlfdHJ4IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgY2hhciB0eCk7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NjX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHNjY19pbml0X3RpbWVyKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKTsKKworc3RhdGljIGludCBzY2NfbmV0X2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKTsKK3N0YXRpYyB2b2lkIHNjY19uZXRfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNjY19uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2NjX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNjY19uZXRfcngoc3RydWN0IHNjY19jaGFubmVsICpzY2MsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBzY2NfbmV0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgc2NjX25ldF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBzY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgU0NDX0RyaXZlck5hbWVbXSA9ICJzY2MiOworCitzdGF0aWMgc3RydWN0IGlycWZsYWdzIHsgdW5zaWduZWQgY2hhciB1c2VkIDogMTsgfSBJdmVjW05SX0lSUVNdOworCQorc3RhdGljIHN0cnVjdCBzY2NfY2hhbm5lbCBTQ0NfSW5mb1syICogU0NDX01BWENISVBTXTsJLyogaW5mb3JtYXRpb24gcGVyIGNoYW5uZWwgKi8KKworc3RhdGljIHN0cnVjdCBzY2NfY3RybCB7CisJaW9fcG9ydCBjaGFuX0E7CisJaW9fcG9ydCBjaGFuX0I7CisJaW50IGlycTsKK30gU0NDX2N0cmxbU0NDX01BWENISVBTKzFdOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBEcml2ZXJfSW5pdGlhbGl6ZWQ7CitzdGF0aWMgaW50IE5jaGlwczsKK3N0YXRpYyBpb19wb3J0IFZlY3Rvcl9MYXRjaDsKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCVBvcnQgQWNjZXNzIEZ1bmN0aW9ucwkJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIFRoZXNlIHByb3ZpZGUgaW50ZXJydXB0IHNhdmUgMi1zdGVwIGFjY2VzcyB0byB0aGUgWjg1MzAgcmVnaXN0ZXJzICovCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9sb2NrKTsJLyogR3VhcmRzIHBhaXJlZCBhY2Nlc3NlcyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgSW5SZWcoaW9fcG9ydCBwb3J0LCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2xvY2ssIGZsYWdzKTsJCisjaWZkZWYgU0NDX0xERUxBWQorCU91dGIocG9ydCwgcmVnKTsKKwl1ZGVsYXkoU0NDX0xERUxBWSk7CisJcj1JbmIocG9ydCk7CisJdWRlbGF5KFNDQ19MREVMQVkpOworI2Vsc2UKKwlPdXRiKHBvcnQsIHJlZyk7CisJcj1JbmIocG9ydCk7CisjZW5kaWYKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIE91dFJlZyhpb19wb3J0IHBvcnQsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbG9jaywgZmxhZ3MpOworI2lmZGVmIFNDQ19MREVMQVkKKwlPdXRiKHBvcnQsIHJlZyk7IHVkZWxheShTQ0NfTERFTEFZKTsKKwlPdXRiKHBvcnQsIHZhbCk7IHVkZWxheShTQ0NfTERFTEFZKTsKKyNlbHNlCisJT3V0Yihwb3J0LCByZWcpOworCU91dGIocG9ydCwgdmFsKTsKKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3Ioc3RydWN0IHNjY19jaGFubmVsICpzY2MsIHVuc2lnbmVkIGNoYXIgcmVnLAorCXVuc2lnbmVkIGNoYXIgdmFsKQoreworCU91dFJlZyhzY2MtPmN0cmwsIHJlZywgKHNjYy0+d3JlZ1tyZWddID0gdmFsKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcihzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworCU91dFJlZyhzY2MtPmN0cmwsIHJlZywgKHNjYy0+d3JlZ1tyZWddIHw9IHZhbCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2woc3RydWN0IHNjY19jaGFubmVsICpzY2MsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlPdXRSZWcoc2NjLT5jdHJsLCByZWcsIChzY2MtPndyZWdbcmVnXSAmPSB+dmFsKSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqCQkJU29tZSB1c2VmdWwgbWFjcm9zCQkJICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNjY19kaXNjYXJkX2J1ZmZlcnMoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CQorCWlmIChzY2MtPnR4X2J1ZmYgIT0gTlVMTCkKKwl7CisJCWRldl9rZnJlZV9za2Ioc2NjLT50eF9idWZmKTsKKwkJc2NjLT50eF9idWZmID0gTlVMTDsKKwl9CisJCisJd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJnNjYy0+dHhfcXVldWUpKQorCQlkZXZfa2ZyZWVfc2tiKHNrYl9kZXF1ZXVlKCZzY2MtPnR4X3F1ZXVlKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKK30KKworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqCQkJSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZXMJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworLyogLS0tLT4gc3Vicm91dGluZXMgZm9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMgPC0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNjY19ub3RpZnkoc3RydWN0IHNjY19jaGFubmVsICpzY2MsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWNoYXIgKmJwOworCQorICAgICAgICBpZiAoc2NjLT5raXNzLmZ1bGxkdXAgIT0gS0lTU19EVVBMRVhfT1BUSU1BKQorCQlyZXR1cm47CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKDIpOworCWlmIChza2IgIT0gTlVMTCkKKwl7CisJCWJwID0gc2tiX3B1dChza2IsIDIpOworCQkqYnArKyA9IFBBUkFNX0hXRVZFTlQ7CisJCSpicCsrID0gZXZlbnQ7CisJCXNjY19uZXRfcngoc2NjLCBza2IpOworCX0gZWxzZQorCQlzY2MtPnN0YXQubm9zcGFjZSsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfcnhfRklGTyhzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwlpbnQgazsKKwkKKwlmb3IgKGs9MDsgazwzOyBrKyspCisJCUluYihzY2MtPmRhdGEpOworCQkKKwlpZihzY2MtPnJ4X2J1ZmYgIT0gTlVMTCkJCS8qIGRpZCB3ZSByZWNlaXZlIHNvbWV0aGluZz8gKi8KKwl7CisJCXNjYy0+c3RhdC5yeGVycnMrKzsgIC8qIHRoZW4gY291bnQgaXQgYXMgYW4gZXJyb3IgKi8KKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2NjLT5yeF9idWZmKTsKKwkJc2NjLT5yeF9idWZmID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2h1bnQoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJaWYgKChzY2MtPm1vZGVtLmNsb2Nrc3JjICE9IENMS19FWFRFUk5BTCkpCisJCU91dFJlZyhzY2MtPmN0cmwsUjE0LFNFQVJDSHxzY2MtPndyZWdbUjE0XSk7IC8qIERQTEw6IGVudGVyIHNlYXJjaCBtb2RlICovCisJb3Ioc2NjLFIzLEVOVF9ITXxSeEVOQUJMRSk7ICAvKiBlbmFibGUgdGhlIHJlY2VpdmVyLCBodW50IG1vZGUgKi8KK30KKworLyogLS0tLT4gZm91ciBkaWZmZXJlbnQgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBUeCwgUngsIGNoYW5naW5nIG9mCSovCisvKiAgICAgICBEQ0QvQ1RTIGFuZCBSeC9UeCBlcnJvcnMJCQkJCSovCisKKy8qIFRyYW5zbWl0dGVyIGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NjX3R4aW50KHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlzY2MtPnN0YXQudHhpbnRzKys7CisJc2tiID0gc2NjLT50eF9idWZmOworCQorCS8qIHNlbmQgZmlyc3Qgb2N0ZXQgKi8KKwkKKwlpZiAoc2tiID09IE5VTEwpCisJeworCQlza2IgPSBza2JfZGVxdWV1ZSgmc2NjLT50eF9xdWV1ZSk7CisJCXNjYy0+dHhfYnVmZiA9IHNrYjsKKwkJbmV0aWZfd2FrZV9xdWV1ZShzY2MtPmRldik7CisKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQl7CisJCQlzY2NfdHhfZG9uZShzY2MpOworCQkJT3V0YihzY2MtPmN0cmwsIFJFU19UeF9QKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKHNrYi0+bGVuID09IDApCQkvKiBQYXJhbm9pYS4uLiAqLworCQl7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJc2NjLT50eF9idWZmID0gTlVMTDsKKwkJCXNjY190eF9kb25lKHNjYyk7CisJCQlPdXRiKHNjYy0+Y3RybCwgUkVTX1R4X1ApOworCQkJcmV0dXJuOworCQl9CisKKwkJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX0FDVElWRTsKKworCQlPdXRSZWcoc2NjLT5jdHJsLCBSMCwgUkVTX1R4X0NSQyk7CisJCQkJCQkvKiByZXNldCBDUkMgZ2VuZXJhdG9yICovCisJCW9yKHNjYyxSMTAsQUJVTkRFUik7CQkvKiByZS1pbnN0YWxsIHVuZGVycnVuIHByb3RlY3Rpb24gKi8KKwkJT3V0YihzY2MtPmRhdGEsKnNrYi0+ZGF0YSk7CS8qIHNlbmQgYnl0ZSAqLworCQlza2JfcHVsbChza2IsIDEpOworCisJCWlmICghc2NjLT5lbmhhbmNlZCkJCS8qIHJlc2V0IEVPTSBsYXRjaCAqLworCQkJT3V0YihzY2MtPmN0cmwsUkVTX0VPTV9MKTsKKwkJcmV0dXJuOworCX0KKwkKKwkvKiBFbmQgT2YgRnJhbWUuLi4gKi8KKwkKKwlpZiAoc2tiLT5sZW4gPT0gMCkKKwl7CisJCU91dGIoc2NjLT5jdHJsLCBSRVNfVHhfUCk7CS8qIHJlc2V0IHBlbmRpbmcgaW50ICovCisJCWNsKHNjYywgUjEwLCBBQlVOREVSKTsJCS8qIHNlbmQgQ1JDICovCisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCXNjYy0+dHhfYnVmZiA9IE5VTEw7CisJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19ORVdGUkFNRTsgLyogbmV4dCBmcmFtZS4uLiAqLworCQlyZXR1cm47CisJfSAKKwkKKwkvKiBzZW5kIG9jdGV0ICovCisJCisJT3V0YihzY2MtPmRhdGEsKnNrYi0+ZGF0YSk7CQkKKwlza2JfcHVsbChza2IsIDEpOworfQorCisKKy8qIEV4dGVybmFsL1N0YXR1cyBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlubGluZSB2b2lkIHNjY19leGludChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyxjaGFuZ2VzLGNoZ19hbmRfc3RhdDsKKworCXNjYy0+c3RhdC5leGludHMrKzsKKworCXN0YXR1cyA9IEluUmVnKHNjYy0+Y3RybCxSMCk7CisJY2hhbmdlcyA9IHN0YXR1cyBeIHNjYy0+c3RhdHVzOworCWNoZ19hbmRfc3RhdCA9IGNoYW5nZXMgJiBzdGF0dXM7CisJCisJLyogQUJPUlQ6IGdlbmVyYXRlZCB3aGVuZXZlciBEQ0QgZHJvcHMgd2hpbGUgcmVjZWl2aW5nICovCisKKwlpZiAoY2hnX2FuZF9zdGF0ICYgQlJLX0FCUlQpCQkvKiBSZWNlaXZlZCBhbiBBQk9SVCAqLworCQlmbHVzaF9yeF9GSUZPKHNjYyk7CisKKwkvKiBIVU5UOiBzb2Z0d2FyZSBEQ0Q7IG9uID0gd2FpdGluZyBmb3IgU1lOQywgb2ZmID0gcmVjZWl2aW5nIGZyYW1lICovCisKKwlpZiAoKGNoYW5nZXMgJiBTWU5DX0hVTlQpICYmIHNjYy0+a2lzcy5zb2Z0ZGNkKQorCXsKKwkJaWYgKHN0YXR1cyAmIFNZTkNfSFVOVCkKKwkJeworCQkJc2NjLT5kY2QgPSAwOworCQkJZmx1c2hfcnhfRklGTyhzY2MpOworCQkJaWYgKChzY2MtPm1vZGVtLmNsb2Nrc3JjICE9IENMS19FWFRFUk5BTCkpCisJCQkJT3V0UmVnKHNjYy0+Y3RybCxSMTQsU0VBUkNIfHNjYy0+d3JlZ1tSMTRdKTsgLyogRFBMTDogZW50ZXIgc2VhcmNoIG1vZGUgKi8KKwkJfSBlbHNlIHsKKwkJCXNjYy0+ZGNkID0gMTsKKwkJfQorCisJCXNjY19ub3RpZnkoc2NjLCBzY2MtPmRjZD8gSFdFVl9EQ0RfT0ZGOkhXRVZfRENEX09OKTsKKwl9CisKKwkvKiBEQ0Q6IG9uID0gc3RhcnQgdG8gcmVjZWl2ZSBwYWNrZXQsIG9mZiA9IEFCT1JUIGNvbmRpdGlvbiAqLworCS8qIChhIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBwYWNrZXQgZ2VuZXJhdGVzIGEgc3BlY2lhbCBjb25kaXRpb24gaW50KSAqLworCQorCWlmKChjaGFuZ2VzICYgRENEKSAmJiAhc2NjLT5raXNzLnNvZnRkY2QpIC8qIERDRCBpbnB1dCBjaGFuZ2VkIHN0YXRlICovCisJeworCQlpZihzdGF0dXMgJiBEQ0QpICAgICAgICAgICAgICAgIC8qIERDRCBpcyBub3cgT04gKi8KKwkJeworCQkJc3RhcnRfaHVudChzY2MpOworCQkJc2NjLT5kY2QgPSAxOworCQl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERDRCBpcyBub3cgT0ZGICovCisJCQljbChzY2MsUjMsRU5UX0hNfFJ4RU5BQkxFKTsgLyogZGlzYWJsZSB0aGUgcmVjZWl2ZXIgKi8KKwkJCWZsdXNoX3J4X0ZJRk8oc2NjKTsKKwkJCXNjYy0+ZGNkID0gMDsKKwkJfQorCQkKKwkJc2NjX25vdGlmeShzY2MsIHNjYy0+ZGNkPyBIV0VWX0RDRF9PTjpIV0VWX0RDRF9PRkYpOworCX0KKworI2lmZGVmIG5vdGRlZgorCS8qIENUUzogdXNlIGV4dGVybmFsIFR4RGVsYXkgKHdoYXQncyB0aGF0IGdvb2QgZm9yPyEpCisJICogQW55d2F5OiBJZiB3ZSBfY291bGRfIHVzZSBpdCAoQmF5Q29tIFVTQ0MgdXNlcyBDVFMgZm9yCisJICogb3duIHB1cnBvc2VzKSB3ZSBfc2hvdWxkXyB1c2UgdGhlICJhdXRvZW5hYmxlIiBmZWF0dXJlCisJICogb2YgdGhlIFo4NTMwIGFuZCBub3QgdGhpcyBpbnRlcnJ1cHQuLi4KKwkgKi8KKwkgCisJaWYgKGNoZ19hbmRfc3RhdCAmIENUUykJCQkvKiBDVFMgaXMgbm93IE9OICovCisJeworCQlpZiAoc2NjLT5raXNzLnR4ZGVsYXkgPT0gMCkJLyogemVybyBUWERFTEFZID0gd2FpdCBmb3IgQ1RTICovCisJCQlzY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X3R4ZGVsYXksIDApOworCX0KKyNlbmRpZgorCQorCWlmIChzY2MtPnN0YXQudHhfc3RhdGUgPT0gVFhTX0FDVElWRSAmJiAoc3RhdHVzICYgVHhFT00pKQorCXsKKwkJc2NjLT5zdGF0LnR4X3VuZGVyKys7CSAgLyogb29wcywgYW4gdW5kZXJydW4hIGNvdW50ICdlbSAqLworCQlPdXRiKHNjYy0+Y3RybCwgUkVTX0VYVF9JTlQpOwkvKiByZXNldCBleHQvc3RhdHVzIGludGVycnVwdHMgKi8KKworCQlpZiAoc2NjLT50eF9idWZmICE9IE5VTEwpCisJCXsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNjYy0+dHhfYnVmZik7CisJCQlzY2MtPnR4X2J1ZmYgPSBOVUxMOworCQl9CisJCQorCQlvcihzY2MsUjEwLEFCVU5ERVIpOworCQlzY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X3R4ZGVsYXksIDApOwkvKiByZXN0YXJ0IHRyYW5zbWlzc2lvbiAqLworCX0KKwkJCisJc2NjLT5zdGF0dXMgPSBzdGF0dXM7CisJT3V0YihzY2MtPmN0cmwsUkVTX0VYVF9JTlQpOworfQorCisKKy8qIFJlY2VpdmVyIGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NjX3J4aW50KHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlzY2MtPnN0YXQucnhpbnRzKys7CisKKwlpZigoc2NjLT53cmVnWzVdICYgUlRTKSAmJiBzY2MtPmtpc3MuZnVsbGR1cCA9PSBLSVNTX0RVUExFWF9IQUxGKQorCXsKKwkJSW5iKHNjYy0+ZGF0YSk7CQkvKiBkaXNjYXJkIGNoYXIgKi8KKwkJb3Ioc2NjLFIzLEVOVF9ITSk7CS8qIGVudGVyIGh1bnQgbW9kZSBmb3IgbmV4dCBmbGFnICovCisJCXJldHVybjsKKwl9CisKKwlza2IgPSBzY2MtPnJ4X2J1ZmY7CisJCisJaWYgKHNrYiA9PSBOVUxMKQorCXsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihzY2MtPnN0YXQuYnVmc2l6ZSk7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJeworCQkJc2NjLT5kZXZfc3RhdC5yeF9kcm9wcGVkKys7CisJCQlzY2MtPnN0YXQubm9zcGFjZSsrOworCQkJSW5iKHNjYy0+ZGF0YSk7CisJCQlvcihzY2MsIFIzLCBFTlRfSE0pOworCQkJcmV0dXJuOworCQl9CisJCQorCQlzY2MtPnJ4X2J1ZmYgPSBza2I7CisJCSooc2tiX3B1dChza2IsIDEpKSA9IDA7CS8qIEtJU1MgZGF0YSAqLworCX0KKwkKKwlpZiAoc2tiLT5sZW4gPj0gc2NjLT5zdGF0LmJ1ZnNpemUpCisJeworI2lmZGVmIG5vdGRlZgorCQlwcmludGsoS0VSTl9ERUJVRyAiejg1MzBkcnY6IG9vcHMsIHNjY19yeGludCgpIHJlY2VpdmVkIGh1Z2UgZnJhbWUuLi5cbiIpOworI2VuZGlmCisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCXNjYy0+cnhfYnVmZiA9IE5VTEw7CisJCUluYihzY2MtPmRhdGEpOworCQlvcihzY2MsIFIzLCBFTlRfSE0pOworCQlyZXR1cm47CisJfQorCisJKihza2JfcHV0KHNrYiwgMSkpID0gSW5iKHNjYy0+ZGF0YSk7Cit9CisKKworLyogUmVjZWl2ZSBTcGVjaWFsIENvbmRpdGlvbiBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlubGluZSB2b2lkIHNjY19zcGludChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2NjLT5zdGF0LnNwaW50cysrOworCisJc3RhdHVzID0gSW5SZWcoc2NjLT5jdHJsLFIxKTsJCS8qIHJlYWQgcmVjZWl2ZXIgc3RhdHVzICovCisJCisJSW5iKHNjYy0+ZGF0YSk7CQkJCS8qIHRocm93IGF3YXkgUnggYnl0ZSAqLworCXNrYiA9IHNjYy0+cnhfYnVmZjsKKworCWlmKHN0YXR1cyAmIFJ4X09WUikJCQkvKiByZWNlaXZlciBvdmVycnVuICovCisJeworCQlzY2MtPnN0YXQucnhfb3ZlcisrOyAgICAgICAgICAgICAvKiBjb3VudCB0aGVtICovCisJCW9yKHNjYyxSMyxFTlRfSE0pOyAgICAgICAgICAgICAgIC8qIGVudGVyIGh1bnQgbW9kZSBmb3IgbmV4dCBmbGFnICovCisJCQorCQlpZiAoc2tiICE9IE5VTEwpIAorCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJc2NjLT5yeF9idWZmID0gc2tiID0gTlVMTDsKKwl9CisKKwlpZihzdGF0dXMgJiBFTkRfRlIgJiYgc2tiICE9IE5VTEwpCS8qIGVuZCBvZiBmcmFtZSAqLworCXsKKwkJLyogQ1JDIG9rYXksIGZyYW1lIGVuZHMgb24gOCBiaXQgYm91bmRhcnkgYW5kIHJlY2VpdmVkIHNvbWV0aGluZyA/ICovCisJCQorCQlpZiAoIShzdGF0dXMgJiBDUkNfRVJSKSAmJiAoc3RhdHVzICYgMHhlKSA9PSBSRVM4ICYmIHNrYi0+bGVuID4gMCkKKwkJeworCQkJLyogaWdub3JlIGxhc3QgcmVjZWl2ZWQgYnl0ZSAoZmlyc3Qgb2YgdGhlIENSQyBieXRlcykgKi8KKwkJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4tMSk7CisJCQlzY2NfbmV0X3J4KHNjYywgc2tiKTsKKwkJCXNjYy0+cnhfYnVmZiA9IE5VTEw7CisJCQlzY2MtPnN0YXQucnhmcmFtZXMrKzsKKwkJfSBlbHNlIHsJCQkJLyogYSBiYWQgZnJhbWUgKi8KKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQlzY2MtPnJ4X2J1ZmYgPSBOVUxMOworCQkJc2NjLT5zdGF0LnJ4ZXJycysrOworCQl9CisJfSAKKworCU91dGIoc2NjLT5jdHJsLEVSUl9SRVMpOworfQorCisKKy8qIC0tLS0+IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIHRoZSBaODUzMCA8LS0tLSAqLworCitzdGF0aWMgdm9pZCBzY2NfaXNyX2Rpc3BhdGNoKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCBpbnQgdmVjdG9yKQoreworCXNwaW5fbG9jaygmc2NjLT5sb2NrKTsKKwlzd2l0Y2ggKHZlY3RvciAmIFZFQ1RPUl9NQVNLKQorCXsKKwkJY2FzZSBUWElOVDogc2NjX3R4aW50KHNjYyk7IGJyZWFrOworCQljYXNlIEVYSU5UOiBzY2NfZXhpbnQoc2NjKTsgYnJlYWs7CisJCWNhc2UgUlhJTlQ6IHNjY19yeGludChzY2MpOyBicmVhazsKKwkJY2FzZSBTUElOVDogc2NjX3NwaW50KHNjYyk7IGJyZWFrOworCX0KKwlzcGluX3VubG9jaygmc2NjLT5sb2NrKTsKK30KKworLyogSWYgdGhlIGNhcmQgaGFzIGEgbGF0Y2ggZm9yIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIChsaWtlIHRoZSBQQTBIWlAgY2FyZCkKKyAgIHVzZSBpdCB0byBnZXQgdGhlIG51bWJlciBvZiB0aGUgY2hpcCB0aGF0IGdlbmVyYXRlZCB0aGUgaW50LgorICAgSWYgbm90OiBwb2xsIGFsbCBkZWZpbmVkIGNoaXBzLgorICovCisKKyNkZWZpbmUgU0NDX0lSUVRJTUVPVVQgMzAwMDAKKworc3RhdGljIGlycXJldHVybl90IHNjY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBjaGFyIHZlY3RvcjsJCisJc3RydWN0IHNjY19jaGFubmVsICpzY2M7CisJc3RydWN0IHNjY19jdHJsICpjdHJsOworCWludCBrOworCQorCWlmIChWZWN0b3JfTGF0Y2gpCisJeworCSAgICAJZm9yKGs9MDsgayA8IFNDQ19JUlFUSU1FT1VUOyBrKyspCisgICAgCQl7CisJCQlPdXRiKFZlY3Rvcl9MYXRjaCwgMCk7ICAgICAgLyogR2VuZXJhdGUgSU5UQUNLICovCisgICAgICAgIAorCQkJLyogUmVhZCB0aGUgdmVjdG9yICovCisJCQlpZigodmVjdG9yPUluYihWZWN0b3JfTGF0Y2gpKSA+PSAxNiAqIE5jaGlwcykgYnJlYWs7IAorCQkJaWYgKHZlY3RvciAmIDB4MDEpIGJyZWFrOworICAgICAgICAJIAorCQkgICAgICAgIHNjYz0mU0NDX0luZm9bdmVjdG9yID4+IDMgXiAweDAxXTsKKwkJCWlmICghc2NjLT5kZXYpIGJyZWFrOworCisJCQlzY2NfaXNyX2Rpc3BhdGNoKHNjYywgdmVjdG9yKTsKKworCQkJT3V0UmVnKHNjYy0+Y3RybCxSMCxSRVNfSF9JVVMpOyAgICAgICAgICAgICAgLyogUmVzZXQgSGlnaGVzdCBJVVMgKi8KKwkJfSAgCisKKwkJaWYgKGsgPT0gU0NDX0lSUVRJTUVPVVQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ6ODUzMGRydjogZW5kbGVzcyBsb29wIGluIHNjY19pc3IoKT9cbiIpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkvKiBGaW5kIHRoZSBTQ0MgZ2VuZXJhdGluZyB0aGUgaW50ZXJydXB0IGJ5IHBvbGxpbmcgYWxsIGF0dGFjaGVkIFNDQ3MKKwkgKiByZWFkaW5nIFJSM0EgKHRoZSBpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlcikKKwkgKi8KKworCWN0cmwgPSBTQ0NfY3RybDsKKwl3aGlsZSAoY3RybC0+Y2hhbl9BKQorCXsKKwkJaWYgKGN0cmwtPmlycSAhPSBpcnEpCisJCXsKKwkJCWN0cmwrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc2NjID0gTlVMTDsKKwkJZm9yIChrID0gMDsgSW5SZWcoY3RybC0+Y2hhbl9BLFIzKSAmJiBrIDwgU0NDX0lSUVRJTUVPVVQ7IGsrKykKKwkJeworCQkJdmVjdG9yPUluUmVnKGN0cmwtPmNoYW5fQixSMik7CS8qIFJlYWQgdGhlIHZlY3RvciAqLworCQkJaWYgKHZlY3RvciAmIDB4MDEpIGJyZWFrOyAKKworCQkJc2NjID0gJlNDQ19JbmZvW3ZlY3RvciA+PiAzIF4gMHgwMV07CisJCSAgICAgICAgaWYgKCFzY2MtPmRldikgYnJlYWs7CisKKwkJCXNjY19pc3JfZGlzcGF0Y2goc2NjLCB2ZWN0b3IpOworCQl9CisKKwkJaWYgKGsgPT0gU0NDX0lSUVRJTUVPVVQpCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIno4NTMwZHJ2OiBlbmRsZXNzIGxvb3AgaW4gc2NjX2lzcigpPyFcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBUaGlzIGxvb2tzIHdlaXJkIGFuZCBpdCBpcy4gQXQgbGVhc3QgdGhlIEJheUNvbSBVU0NDIGRvZXNuJ3QKKwkJICogdXNlIHRoZSBJbnRlcnJ1cHQgRGFpc3kgQ2hhaW4sIHRodXMgd2UnbGwgaGF2ZSB0byBzdGFydAorCQkgKiBhbGwgb3ZlciBhZ2FpbiB0byBiZSBzdXJlIG5vdCB0byBtaXNzIGFuIGludGVycnVwdCBmcm9tIAorCQkgKiAoYW55IG9mKSB0aGUgb3RoZXIgY2hpcChzKS4uLgorCQkgKiBIb25lc3RseSwgdGhlIHNpdHVhdGlvbiAqaXMqIGJyYWluZGFtYWdlZC4uLgorCQkgKi8KKworCQlpZiAoc2NjICE9IE5VTEwpCisJCXsKKwkJCU91dFJlZyhzY2MtPmN0cmwsUjAsUkVTX0hfSVVTKTsKKwkJCWN0cmwgPSBTQ0NfY3RybDsgCisJCX0gZWxzZQorCQkJY3RybCsrOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCUluaXQgQ2hhbm5lbAkJCQkJKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworLyogLS0tLT4gc2V0IFNDQyBjaGFubmVsIHNwZWVkIDwtLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYnJnKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCB1bnNpZ25lZCBpbnQgdGMpCit7CisJY2woc2NjLFIxNCxCUkVOQUJMKTsJCS8qIGRpc2FibGUgYmF1ZHJhdGUgZ2VuZXJhdG9yICovCisJd3Ioc2NjLFIxMix0YyAmIDI1NSk7CQkvKiBicmcgcmF0ZSBMT1cgKi8KKwl3cihzY2MsUjEzLHRjID4+IDgpOyAgIAkJLyogYnJnIHJhdGUgSElHSCAqLworCW9yKHNjYyxSMTQsQlJFTkFCTCk7CQkvKiBlbmFibGUgYmF1ZHJhdGUgZ2VuZXJhdG9yICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc3BlZWQoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc2NjLT5tb2RlbS5zcGVlZCA+IDApCS8qIHBhcmFub2lhLi4uICovCisJCXNldF9icmcoc2NjLCAodW5zaWduZWQpIChzY2MtPmNsb2NrIC8gKHNjYy0+bW9kZW0uc3BlZWQgKiA2NCkpIC0gMik7CisJCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOworfQorCisKKy8qIC0tLS0+IGluaXRpYWxpemUgYSBTQ0MgY2hhbm5lbCA8LS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9icmcoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJd3Ioc2NjLCBSMTQsIEJSU1JDKTsJCQkJLyogQlJHIHNvdXJjZSA9IFBDTEsgKi8KKwlPdXRSZWcoc2NjLT5jdHJsLCBSMTQsIFNTQlJ8c2NjLT53cmVnW1IxNF0pOwkvKiBEUExMIHNvdXJjZSA9IEJSRyAqLworCU91dFJlZyhzY2MtPmN0cmwsIFIxNCwgU05SWkl8c2NjLT53cmVnW1IxNF0pOwkvKiBEUExMIE5SWkkgbW9kZSAqLworfQorCisvKgorICogSW5pdGlhbGl6YXRpb24gYWNjb3JkaW5nIHRvIHRoZSBaODUzMCBtYW51YWwgKFNHUy1UaG9tc29uJ3MgdmVyc2lvbik6CisgKgorICogMS4gTW9kZXMgYW5kIGNvbnN0YW50cworICoKKyAqIFdSOQkxMTAwMDAwMAljaGlwIHJlc2V0CisgKiBXUjQJWFhYWFhYWFgJVHgvUnggY29udHJvbCwgYXN5bmMgb3Igc3luYyBtb2RlCisgKiBXUjEJMFhYMDBYMDAJc2VsZWN0IFcvUkVRIChvcHRpb25hbCkKKyAqIFdSMglYWFhYWFhYWAlwcm9ncmFtIGludGVycnVwdCB2ZWN0b3IKKyAqIFdSMwlYWFhYWFhYMAlzZWxlY3QgUnggY29udHJvbAorICogV1I1CVhYWFgwWFhYCXNlbGVjdCBUeCBjb250cm9sCisgKiBXUjYJWFhYWFhYWFgJc3luYyBjaGFyYWN0ZXIKKyAqIFdSNwlYWFhYWFhYWAlzeW5jIGNoYXJhY3RlcgorICogV1I5CTAwMFgwWFhYCXNlbGVjdCBpbnRlcnJ1cHQgY29udHJvbAorICogV1IxMAlYWFhYWFhYWAltaXNjZWxsYW5lb3VzIGNvbnRyb2wgKG9wdGlvbmFsKQorICogV1IxMQlYWFhYWFhYWAljbG9jayBjb250cm9sCisgKiBXUjEyCVhYWFhYWFhYCXRpbWUgY29uc3RhbnQgbG93ZXIgYnl0ZSAob3B0aW9uYWwpCisgKiBXUjEzCVhYWFhYWFhYCXRpbWUgY29uc3RhbnQgdXBwZXIgYnl0ZSAob3B0aW9uYWwpCisgKiBXUjE0CVhYWFhYWFgwCW1pc2NlbGxhbmVvdXMgY29udHJvbAorICogV1IxNAlYWFhTU1NTUwljb21tYW5kcyAob3B0aW9uYWwpCisgKgorICogMi4gRW5hYmxlcworICoKKyAqIFdSMTQJMDAwU1NTUzEJYmF1ZCByYXRlIGVuYWJsZQorICogV1IzCVNTU1NTU1MxCVJ4IGVuYWJsZQorICogV1I1CVNTU1MxU1NTCVR4IGVuYWJsZQorICogV1IwCTEwMDAwMDAwCXJlc2V0IFR4IENSRyAob3B0aW9uYWwpCisgKiBXUjEJWFNTMDBTMDAJRE1BIGVuYWJsZSAob3B0aW9uYWwpCisgKgorICogMy4gSW50ZXJydXB0IHN0YXR1cworICoKKyAqIFdSMTUJWFhYWFhYWFgJZW5hYmxlIGV4dGVybmFsL3N0YXR1cworICogV1IwCTAwMDEwMDAwCXJlc2V0IGV4dGVybmFsIHN0YXR1cworICogV1IwCTAwMDEwMDAwCXJlc2V0IGV4dGVybmFsIHN0YXR1cyB0d2ljZQorICogV1IxCVNTU1hYU1hYCWVuYWJsZSBSeCwgVHggYW5kIEV4dC9zdGF0dXMKKyAqIFdSOQkwMDBTWFNTUwllbmFibGUgbWFzdGVyIGludGVycnVwdCBlbmFibGUKKyAqCisgKiAxID0gc2V0IHRvIG9uZSwgMCA9IHJlc2V0IHRvIHplcm8KKyAqIFggPSB1c2VyIGRlZmluZWQsIFMgPSBzYW1lIGFzIHByZXZpb3VzIGluaXQKKyAqCisgKgorICogTm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmZXJzIGluIHNvbWUgcG9pbnRzIGZyb20gYWJvdmUgc2NoZW1lLgorICoKKyAqLworIAorc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCWRlbF90aW1lcigmc2NjLT50eF90KTsKKwlkZWxfdGltZXIoJnNjYy0+dHhfd2RvZyk7CisKKwlkaXNhYmxlX2lycShzY2MtPmlycSk7CisKKwl3cihzY2MsUjQsWDFDTEt8U0RMQyk7CQkvKiAqMSBjbG9jaywgU0RMQyBtb2RlICovCisJd3Ioc2NjLFIxLDApOwkJCS8qIG5vIFcvUkVRIG9wZXJhdGlvbiAqLworCXdyKHNjYyxSMyxSeDh8UnhDUkNfRU5BQik7CS8qIFJYIDggYml0cy9jaGFyLCBDUkMsIGRpc2FibGVkICovCQorCXdyKHNjYyxSNSxUeDh8RFRSfFR4Q1JDX0VOQUIpOwkvKiBUWCA4IGJpdHMvY2hhciwgZGlzYWJsZWQsIERUUiAqLworCXdyKHNjYyxSNiwwKTsJCQkvKiBTRExDIGFkZHJlc3MgemVybyAobm90IHVzZWQpICovCisJd3Ioc2NjLFI3LEZMQUcpOwkJLyogU0RMQyBmbGFnIHZhbHVlICovCisJd3Ioc2NjLFI5LFZJUyk7CQkJLyogdmVjdG9yIGluY2x1ZGVzIHN0YXR1cyAqLworCXdyKHNjYyxSMTAsKHNjYy0+bW9kZW0ubnJ6PyBOUlogOiBOUlpJKXxDUkNQU3xBQlVOREVSKTsgLyogYWJvcnQgb24gdW5kZXJydW4sIHByZXNldCBDUkMgZ2VuZXJhdG9yLCBOUlooSSkgKi8KKwl3cihzY2MsUjE0LCAwKTsKKworCisvKiBzZXQgY2xvY2sgc291cmNlczoKKworICAgQ0xLX0RQTEw6IG5vcm1hbCBoYWxmZHVwbGV4IG9wZXJhdGlvbgorICAgCisJCVJ4Q2xrOiB1c2UgRFBMTAorCQlUeENsazogdXNlIERQTEwKKwkJVFJ4QyBtb2RlIERQTEwgb3V0cHV0CisJCQorICAgQ0xLX0VYVEVSTkFMOiBleHRlcm5hbCBjbG9ja2luZyAoRzNSVUggb3IgREY5SUMgbW9kZW0pCisgICAKKyAgCSAgICAgICAgQmF5Q29tOiAJCW90aGVyczoKKyAgCSAgICAgICAgCisgIAkgICAgICAgIFR4Q2xrID0gcGluIFJUeEMJVHhDbGsgPSBwaW4gVFJ4QworICAJICAgICAgICBSeENsayA9IHBpbiBUUnhDIAlSeENsayA9IHBpbiBSVHhDCisgIAkgICAgIAorCisgICBDTEtfRElWSURFUjoKKyAgIAkJUnhDbGsgPSB1c2UgRFBMTAorICAgCQlUeENsayA9IHBpbiBSVHhDCisgICAJCQorICAgCQlCYXlDb206CQkJb3RoZXJzOgorICAgCQlwaW4gVFJ4QyA9IERQTEwJCXBpbiBUUnhDID0gQlJHCisgICAJCShSeENsayAqIDEpCQkoUnhDbGsgKiAzMikKKyovICAKKworICAgCQkKKwlzd2l0Y2goc2NjLT5tb2RlbS5jbG9ja3NyYykKKwl7CisJCWNhc2UgQ0xLX0RQTEw6CisJCQl3cihzY2MsIFIxMSwgUkNEUExMfFRDRFBMTHxUUnhDT0l8VFJ4Q0RQKTsKKwkJCWluaXRfYnJnKHNjYyk7CisJCQlicmVhazsKKworCQljYXNlIENMS19ESVZJREVSOgorCQkJd3Ioc2NjLCBSMTEsICgoc2NjLT5icmFuZCAmIEJBWUNPTSk/IFRSeENEUCA6IFRSeENCUikgfCBSQ0RQTEx8VENSVHhDUHxUUnhDT0kpOworCQkJaW5pdF9icmcoc2NjKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ0xLX0VYVEVSTkFMOgorCQkJd3Ioc2NjLCBSMTEsIChzY2MtPmJyYW5kICYgQkFZQ09NKT8gUkNUUnhDUHxUQ1JUeENQIDogUkNSVHhDUHxUQ1RSeENQKTsKKwkJCU91dFJlZyhzY2MtPmN0cmwsIFIxNCwgRElTRFBMTCk7CisJCQlicmVhazsKKworCX0KKwkKKwlzZXRfc3BlZWQoc2NjKTsJCQkvKiBzZXQgYmF1ZHJhdGUgKi8KKwkKKwlpZihzY2MtPmVuaGFuY2VkKQorCXsKKwkJb3Ioc2NjLFIxNSxTSERMQ0V8RklGT0UpOwkvKiBlbmFibGUgRklGTywgU0RMQy9IRExDIEVuaGFuY2VtZW50cyAoRnJvbSBub3cgUjcgaXMgUjcnKSAqLworCQl3cihzY2MsUjcsQVVUT0VPTSk7CisJfQorCisJaWYoc2NjLT5raXNzLnNvZnRkY2QgfHwgKEluUmVnKHNjYy0+Y3RybCxSMCkgJiBEQ0QpKQorCQkJCQkJLyogRENEIGlzIG5vdyBPTiAqLworCXsKKwkJc3RhcnRfaHVudChzY2MpOworCX0KKwkKKwkvKiBlbmFibGUgQUJPUlQsIERDRCAmIFNZTkMvSFVOVCBpbnRlcnJ1cHRzICovCisKKwl3cihzY2MsUjE1LCBCUktJRXxUeFVJRXwoc2NjLT5raXNzLnNvZnRkY2Q/IFNZTkNJRTpEQ0RJRSkpOworCisJT3V0YihzY2MtPmN0cmwsUkVTX0VYVF9JTlQpOwkvKiByZXNldCBleHQvc3RhdHVzIGludGVycnVwdHMgKi8KKwlPdXRiKHNjYy0+Y3RybCxSRVNfRVhUX0lOVCk7CS8qIG11c3QgYmUgZG9uZSB0d2ljZSAqLworCisJb3Ioc2NjLFIxLElOVF9BTExfUnh8VHhJTlRfRU5BQnxFWFRfSU5UX0VOQUIpOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCQorCXNjYy0+c3RhdHVzID0gSW5SZWcoc2NjLT5jdHJsLFIwKTsJLyogcmVhZCBpbml0aWFsIHN0YXR1cyAqLworCQorCW9yKHNjYyxSOSxNSUUpOwkJCS8qIG1hc3RlciBpbnRlcnJ1cHQgZW5hYmxlICovCisJCisJc2NjX2luaXRfdGltZXIoc2NjKTsKKwkJCQorCWVuYWJsZV9pcnEoc2NjLT5pcnEpOworfQorCisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCVNDQyB0aW1lciBmdW5jdGlvbnMJCQkgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKy8qIC0tLS0+IHNjY19rZXlfdHJ4IHNldHMgdGhlIHRpbWUgY29uc3RhbnQgZm9yIHRoZSBiYXVkcmF0ZSAKKyAgICAgICAgIGdlbmVyYXRvciBhbmQga2V5cyB0aGUgdHJhbnNtaXR0ZXIJCSAgICAgPC0tLS0gKi8KKworc3RhdGljIHZvaWQgc2NjX2tleV90cngoc3RydWN0IHNjY19jaGFubmVsICpzY2MsIGNoYXIgdHgpCit7CisJdW5zaWduZWQgaW50IHRpbWVfY29uc3Q7CisJCQorCWlmIChzY2MtPmJyYW5kICYgUFJJTVVTKQorCQlPdXRiKHNjYy0+Y3RybCArIDQsIHNjYy0+b3B0aW9uIHwgKHR4PyAweDgwIDogMCkpOworCisJaWYgKHNjYy0+bW9kZW0uc3BlZWQgPCAzMDApIAorCQlzY2MtPm1vZGVtLnNwZWVkID0gMTIwMDsKKworCXRpbWVfY29uc3QgPSAodW5zaWduZWQpIChzY2MtPmNsb2NrIC8gKHNjYy0+bW9kZW0uc3BlZWQgKiAodHg/IDI6NjQpKSkgLSAyOworCisJZGlzYWJsZV9pcnEoc2NjLT5pcnEpOworCisJaWYgKHR4KQorCXsKKwkJb3Ioc2NjLCBSMSwgVHhJTlRfRU5BQik7CS8qIHRfbWF4a2V5dXAgbWF5IGhhdmUgcmVzZXQgdGhlc2UgKi8KKwkJb3Ioc2NjLCBSMTUsIFR4VUlFKTsKKwl9CisKKwlpZiAoc2NjLT5tb2RlbS5jbG9ja3NyYyA9PSBDTEtfRFBMTCkKKwl7CQkJCS8qIGZvcmNlIHNpbXBsZXggb3BlcmF0aW9uICovCisJCWlmICh0eCkKKwkJeworI2lmZGVmIENPTkZJR19TQ0NfVFJYRUNITworCQkJY2woc2NjLCBSMywgUnhFTkFCTEV8RU5UX0hNKTsJLyogc3dpdGNoIG9mZiByZWNlaXZlciAqLworCQkJY2woc2NjLCBSMTUsIERDRElFfFNZTkNJRSk7CS8qIE5vIERDRCBjaGFuZ2VzLCBwbGVhc2UgKi8KKyNlbmRpZgorCQkJc2V0X2JyZyhzY2MsIHRpbWVfY29uc3QpOwkvKiByZXByb2dyYW0gYmF1ZHJhdGUgZ2VuZXJhdG9yICovCisKKwkJCS8qIERQTEwgLT4gUnggY2xrLCBCUkcgLT4gVHggQ0xLLCBUUnhDIG1vZGUgb3V0cHV0LCBUUnhDID0gQlJHICovCisJCQl3cihzY2MsIFIxMSwgUkNEUExMfFRDQlJ8VFJ4Q09JfFRSeENCUik7CisJCQkKKwkJCS8qIEJ5IHBvcHVsYXIgZGVtYW5kOiB0eF9pbmhpYml0ICovCisJCQlpZiAoc2NjLT5raXNzLnR4X2luaGliaXQpCisJCQl7CisJCQkJb3Ioc2NjLFI1LCBUeEVOQUIpOworCQkJCXNjYy0+d3JlZ1tSNV0gfD0gUlRTOworCQkJfSBlbHNlIHsKKwkJCQlvcihzY2MsUjUsUlRTfFR4RU5BQik7CS8qIHNldCB0aGUgUlRTIGxpbmUgYW5kIGVuYWJsZSBUWCAqLworCQkJfQorCQl9IGVsc2UgeworCQkJY2woc2NjLFI1LFJUU3xUeEVOQUIpOworCQkJCisJCQlzZXRfYnJnKHNjYywgdGltZV9jb25zdCk7CS8qIHJlcHJvZ3JhbSBiYXVkcmF0ZSBnZW5lcmF0b3IgKi8KKwkJCQorCQkJLyogRFBMTCAtPiBSeCBjbGssIERQTEwgLT4gVHggQ0xLLCBUUnhDIG1vZGUgb3V0cHV0LCBUUnhDID0gRFBMTCAqLworCQkJd3Ioc2NjLCBSMTEsIFJDRFBMTHxUQ0RQTEx8VFJ4Q09JfFRSeENEUCk7CisKKyNpZm5kZWYgQ09ORklHX1NDQ19UUlhFQ0hPCisJCQlpZiAoc2NjLT5raXNzLnNvZnRkY2QpCisjZW5kaWYKKwkJCXsKKwkJCQlvcihzY2MsUjE1LCBzY2MtPmtpc3Muc29mdGRjZD8gU1lOQ0lFOkRDRElFKTsKKwkJCQlzdGFydF9odW50KHNjYyk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAodHgpCisJCXsKKyNpZmRlZiBDT05GSUdfU0NDX1RSWEVDSE8KKwkJCWlmIChzY2MtPmtpc3MuZnVsbGR1cCA9PSBLSVNTX0RVUExFWF9IQUxGKQorCQkJeworCQkJCWNsKHNjYywgUjMsIFJ4RU5BQkxFKTsKKwkJCQljbChzY2MsIFIxNSwgRENESUV8U1lOQ0lFKTsKKwkJCX0KKyNlbmRpZgorCQkJCQorCQkJaWYgKHNjYy0+a2lzcy50eF9pbmhpYml0KQorCQkJeworCQkJCW9yKHNjYyxSNSwgVHhFTkFCKTsKKwkJCQlzY2MtPndyZWdbUjVdIHw9IFJUUzsKKwkJCX0gZWxzZSB7CQorCQkJCW9yKHNjYyxSNSxSVFN8VHhFTkFCKTsJLyogZW5hYmxlIHR4ICovCisJCQl9CisJCX0gZWxzZSB7CisJCQljbChzY2MsUjUsUlRTfFR4RU5BQik7CQkvKiBkaXNhYmxlIHR4ICovCisKKwkJCWlmICgoc2NjLT5raXNzLmZ1bGxkdXAgPT0gS0lTU19EVVBMRVhfSEFMRikgJiYKKyNpZm5kZWYgQ09ORklHX1NDQ19UUlhFQ0hPCisJCQkgICAgc2NjLT5raXNzLnNvZnRkY2QpCisjZWxzZQorCQkJICAgIDEpCisjZW5kaWYKKwkJCXsKKwkJCQlvcihzY2MsIFIxNSwgc2NjLT5raXNzLnNvZnRkY2Q/IFNZTkNJRTpEQ0RJRSk7CisJCQkJc3RhcnRfaHVudChzY2MpOworCQkJfQorCQl9CisJfQorCisJZW5hYmxlX2lycShzY2MtPmlycSk7Cit9CisKKworLyogLS0tLT4gU0NDIHRpbWVyIGludGVycnVwdCBoYW5kbGVyIGFuZCBmcmllbmRzLiA8LS0tLSAqLworCitzdGF0aWMgdm9pZCBfX3NjY19zdGFydF90eF90aW1lcihzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgdm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGxvbmcpLCB1bnNpZ25lZCBsb25nIHdoZW4pCit7CisJZGVsX3RpbWVyKCZzY2MtPnR4X3QpOworCisJaWYgKHdoZW4gPT0gMCkKKwl7CisJCWhhbmRsZXIoKHVuc2lnbmVkIGxvbmcpIHNjYyk7CisJfSBlbHNlIAorCWlmICh3aGVuICE9IFRJTUVSX09GRikKKwl7CisJCXNjYy0+dHhfdC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHNjYzsKKwkJc2NjLT50eF90LmZ1bmN0aW9uID0gaGFuZGxlcjsKKwkJc2NjLT50eF90LmV4cGlyZXMgPSBqaWZmaWVzICsgKHdoZW4qSFopLzEwMDsKKwkJYWRkX3RpbWVyKCZzY2MtPnR4X3QpOworCX0KK30KKworc3RhdGljIHZvaWQgc2NjX3N0YXJ0X3R4X3RpbWVyKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCB2b2lkICgqaGFuZGxlcikodW5zaWduZWQgbG9uZyksIHVuc2lnbmVkIGxvbmcgd2hlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzY2MtPmxvY2ssIGZsYWdzKTsKKwlfX3NjY19zdGFydF90eF90aW1lcihzY2MsIGhhbmRsZXIsIHdoZW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzY2Nfc3RhcnRfZGVmZXIoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CisJZGVsX3RpbWVyKCZzY2MtPnR4X3dkb2cpOworCQorCWlmIChzY2MtPmtpc3MubWF4ZGVmZXIgIT0gMCAmJiBzY2MtPmtpc3MubWF4ZGVmZXIgIT0gVElNRVJfT0ZGKQorCXsKKwkJc2NjLT50eF93ZG9nLmRhdGEgPSAodW5zaWduZWQgbG9uZykgc2NjOworCQlzY2MtPnR4X3dkb2cuZnVuY3Rpb24gPSB0X2J1c3k7CisJCXNjYy0+dHhfd2RvZy5leHBpcmVzID0gamlmZmllcyArIEhaKnNjYy0+a2lzcy5tYXhkZWZlcjsKKwkJYWRkX3RpbWVyKCZzY2MtPnR4X3dkb2cpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2NjX3N0YXJ0X21heGtleXVwKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOworCWRlbF90aW1lcigmc2NjLT50eF93ZG9nKTsKKwkKKwlpZiAoc2NjLT5raXNzLm1heGtleXVwICE9IDAgJiYgc2NjLT5raXNzLm1heGtleXVwICE9IFRJTUVSX09GRikKKwl7CisJCXNjYy0+dHhfd2RvZy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHNjYzsKKwkJc2NjLT50eF93ZG9nLmZ1bmN0aW9uID0gdF9tYXhrZXl1cDsKKwkJc2NjLT50eF93ZG9nLmV4cGlyZXMgPSBqaWZmaWVzICsgSFoqc2NjLT5raXNzLm1heGtleXVwOworCQlhZGRfdGltZXIoJnNjYy0+dHhfd2RvZyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOworfQorCisvKiAKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gc2NjX3R4aW50KCkgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBmcmFtZXMgdG8gc2VuZC4KKyAqIE5vdCBleGFjdGx5IGEgdGltZXIgZnVuY3Rpb24sIGJ1dCBpdCBpcyBhIGNsb3NlIGZyaWVuZCBvZiB0aGUgZmFtaWx5Li4uCisgKi8KKworc3RhdGljIHZvaWQgc2NjX3R4X2RvbmUoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJLyogCisJICogdHJ4IHJlbWFpbnMga2V5ZWQgaW4gZnVsbGR1cCBtb2RlIDIgdW50aWwgdF9pZGxlIGV4cGlyZXMuCisJICovCisJCQkJIAorCXN3aXRjaCAoc2NjLT5raXNzLmZ1bGxkdXApCisJeworCQljYXNlIEtJU1NfRFVQTEVYX0xJTks6CisJCQlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfSURMRTI7CisJCQlpZiAoc2NjLT5raXNzLmlkbGV0aW1lICE9IFRJTUVSX09GRikKKwkJCXNjY19zdGFydF90eF90aW1lcihzY2MsIHRfaWRsZSwgc2NjLT5raXNzLmlkbGV0aW1lKjEwMCk7CisJCQlicmVhazsKKwkJY2FzZSBLSVNTX0RVUExFWF9PUFRJTUE6CisJCQlzY2Nfbm90aWZ5KHNjYywgSFdFVl9BTExfU0VOVCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19CVVNZOworCQkJc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF90YWlsLCBzY2MtPmtpc3MudGFpbHRpbWUpOworCX0KKworCW5ldGlmX3dha2VfcXVldWUoc2NjLT5kZXYpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFJhbmQgPSAxNzsKKworc3RhdGljIGlubGluZSBpbnQgaXNfZ3JvdXBlZChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwlpbnQgazsKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYzI7CisJdW5zaWduZWQgY2hhciBncnAxLCBncnAyOworCisJZ3JwMSA9IHNjYy0+a2lzcy5ncm91cDsKKwkKKwlmb3IgKGsgPSAwOyBrIDwgKE5jaGlwcyAqIDIpOyBrKyspCisJeworCQlzY2MyID0gJlNDQ19JbmZvW2tdOworCQlncnAyID0gc2NjMi0+a2lzcy5ncm91cDsKKwkJCisJCWlmIChzY2MyID09IHNjYyB8fCAhKHNjYzItPmRldiAmJiBncnAyKSkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKChncnAxICYgMHgzZikgPT0gKGdycDIgJiAweDNmKSkKKwkJeworCQkJaWYgKCAoZ3JwMSAmIFRYR1JPVVApICYmIChzY2MyLT53cmVnW1I1XSAmIFJUUykgKQorCQkJCXJldHVybiAxOworCQkJCisJCQlpZiAoIChncnAxICYgUlhHUk9VUCkgJiYgc2NjMi0+ZGNkICkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogRFdBSVQgYW5kIFNMT1RUSU1FIGV4cGlyZWQKKyAqCisgKiBmdWxsZHVwID09IDA6ICBEQ0QgaXMgYWN0aXZlIG9yIFJhbmQgPiBQLXBlcnNpc3RlbmNlOiBzdGFydCB0X2J1c3kgdGltZXIKKyAqICAgICAgICAgICAgICAgIGVsc2Uga2V5IHRyeCBhbmQgc3RhcnQgdHhkZWxheQorICogZnVsbGR1cCA9PSAxOiAga2V5IHRyeCBhbmQgc3RhcnQgdHhkZWxheQorICogZnVsbGR1cCA9PSAyOiAgbWludGltZSBleHBpcmVkLCByZXNldCBzdGF0dXMgb3Iga2V5IHRyeCBhbmQgc3RhcnQgdHhkZWxheQorICovCisKK3N0YXRpYyB2b2lkIHRfZHdhaXQodW5zaWduZWQgbG9uZyBjaGFubmVsKQoreworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjID0gKHN0cnVjdCBzY2NfY2hhbm5lbCAqKSBjaGFubmVsOworCQorCWlmIChzY2MtPnN0YXQudHhfc3RhdGUgPT0gVFhTX1dBSVQpCS8qIG1heGtleXVwIG9yIGlkbGUgdGltZW91dCAqLworCXsKKwkJaWYgKHNrYl9xdWV1ZV9sZW4oJnNjYy0+dHhfcXVldWUpID09IDApCS8qIG5vdGhpbmcgdG8gc2VuZCAqLworCQl7CisJCQlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfSURMRTsKKwkJCW5ldGlmX3dha2VfcXVldWUoc2NjLT5kZXYpOwkvKiB0X21heGtleXVwIGxvY2tlZCBpdC4gKi8KKwkJCXJldHVybjsKKwkJfQorCisJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19CVVNZOworCX0KKworCWlmIChzY2MtPmtpc3MuZnVsbGR1cCA9PSBLSVNTX0RVUExFWF9IQUxGKQorCXsKKwkJUmFuZCA9IFJhbmQgKiAxNyArIDMxOworCQkKKwkJaWYgKHNjYy0+ZGNkIHx8IChzY2MtPmtpc3MucGVyc2lzdCkgPCBSYW5kIHx8IChzY2MtPmtpc3MuZ3JvdXAgJiYgaXNfZ3JvdXBlZChzY2MpKSApCisJCXsKKwkJCXNjY19zdGFydF9kZWZlcihzY2MpOworCQkJc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF9kd2FpdCwgc2NjLT5raXNzLnNsb3R0aW1lKTsKKwkJCXJldHVybiA7CisJCX0KKwl9CisKKwlpZiAoICEoc2NjLT53cmVnW1I1XSAmIFJUUykgKQorCXsKKwkJc2NjX2tleV90cngoc2NjLCBUWF9PTik7CisJCXNjY19zdGFydF90eF90aW1lcihzY2MsIHRfdHhkZWxheSwgc2NjLT5raXNzLnR4ZGVsYXkpOworCX0gZWxzZSB7CisJCXNjY19zdGFydF90eF90aW1lcihzY2MsIHRfdHhkZWxheSwgMCk7CisJfQorfQorCisKKy8qIFRYREVMQVkgZXhwaXJlZAorICoKKyAqIGtpY2sgdHJhbnNtaXNzaW9uIGJ5IGEgZmFrZSBzY2NfdHhpbnQoc2NjKSwgc3RhcnQgJ21heGtleXVwJyB3YXRjaGRvZy4KKyAqLworCitzdGF0aWMgdm9pZCB0X3R4ZGVsYXkodW5zaWduZWQgbG9uZyBjaGFubmVsKQoreworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjID0gKHN0cnVjdCBzY2NfY2hhbm5lbCAqKSBjaGFubmVsOworCisJc2NjX3N0YXJ0X21heGtleXVwKHNjYyk7CisKKwlpZiAoc2NjLT50eF9idWZmID09IE5VTEwpCisJeworCQlkaXNhYmxlX2lycShzY2MtPmlycSk7CisJCXNjY190eGludChzY2MpOwkKKwkJZW5hYmxlX2lycShzY2MtPmlycSk7CisJfQorfQorCQorCisvKiBUQUlMVElNRSBleHBpcmVkCisgKgorICogc3dpdGNoIG9mZiB0cmFuc21pdHRlci4gSWYgd2Ugd2VyZSBzdG9wcGVkIGJ5IE1heGtleXVwIHJlc3RhcnQKKyAqIHRyYW5zbWlzc2lvbiBhZnRlciAnbWludGltZScgc2Vjb25kcworICovCisKK3N0YXRpYyB2b2lkIHRfdGFpbCh1bnNpZ25lZCBsb25nIGNoYW5uZWwpCit7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSAoc3RydWN0IHNjY19jaGFubmVsICopIGNoYW5uZWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7IAorIAlkZWxfdGltZXIoJnNjYy0+dHhfd2RvZyk7CQorIAlzY2Nfa2V5X3RyeChzY2MsIFRYX09GRik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NjLT5sb2NrLCBmbGFncyk7CisKKyAJaWYgKHNjYy0+c3RhdC50eF9zdGF0ZSA9PSBUWFNfVElNRU9VVCkJCS8qIHdlIGhhZCBhIHRpbWVvdXQ/ICovCisgCXsKKyAJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19XQUlUOworCQlzY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X2R3YWl0LCBzY2MtPmtpc3MubWludGltZSoxMDApOworIAkJcmV0dXJuOworIAl9CisgCQorIAlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfSURMRTsKKwluZXRpZl93YWtlX3F1ZXVlKHNjYy0+ZGV2KTsKK30KKworCisvKiBCVVNZIHRpbWVvdXQKKyAqCisgKiB0aHJvdyBhd2F5IHNlbmQgYnVmZmVycyBpZiBEQ0QgcmVtYWlucyBhY3RpdmUgdG9vIGxvbmcuCisgKi8KKworc3RhdGljIHZvaWQgdF9idXN5KHVuc2lnbmVkIGxvbmcgY2hhbm5lbCkKK3sKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgY2hhbm5lbDsKKworCWRlbF90aW1lcigmc2NjLT50eF90KTsKKwluZXRpZl9zdG9wX3F1ZXVlKHNjYy0+ZGV2KTsJLyogZG9uJ3QgcGlsZSBvbiB0aGUgd2FiYml0ISAqLworCisJc2NjX2Rpc2NhcmRfYnVmZmVycyhzY2MpOworCXNjYy0+c3RhdC50eGVycnMrKzsKKwlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfSURMRTsKKworCW5ldGlmX3dha2VfcXVldWUoc2NjLT5kZXYpOwkKK30KKworLyogTUFYS0VZVVAgdGltZW91dAorICoKKyAqIHRoaXMgaXMgb3VyIHdhdGNoZG9nLgorICovCisKK3N0YXRpYyB2b2lkIHRfbWF4a2V5dXAodW5zaWduZWQgbG9uZyBjaGFubmVsKQoreworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjID0gKHN0cnVjdCBzY2NfY2hhbm5lbCAqKSBjaGFubmVsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CisJLyogCisJICogbGV0IHRoaW5ncyBzZXR0bGUgZG93biBiZWZvcmUgd2Ugc3RhcnQgdG8KKwkgKiBhY2NlcHQgbmV3IGRhdGEuCisJICovCisKKwluZXRpZl9zdG9wX3F1ZXVlKHNjYy0+ZGV2KTsKKwlzY2NfZGlzY2FyZF9idWZmZXJzKHNjYyk7CisKKwlkZWxfdGltZXIoJnNjYy0+dHhfdCk7CisKKwljbChzY2MsIFIxLCBUeElOVF9FTkFCKTsJLyogZm9yY2UgYW4gQUJPUlQsIGJ1dCBkb24ndCAqLworCWNsKHNjYywgUjE1LCBUeFVJRSk7CQkvKiBjb3VudCBpdC4gKi8KKwlPdXRSZWcoc2NjLT5jdHJsLCBSMCwgUkVTX1R4X1ApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NjLT5sb2NrLCBmbGFncyk7CisKKwlzY2MtPnN0YXQudHhlcnJzKys7CisJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX1RJTUVPVVQ7CisJc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF90YWlsLCBzY2MtPmtpc3MudGFpbHRpbWUpOworfQorCisvKiBJRExFIHRpbWVvdXQKKyAqCisgKiBpbiBmdWxsZHVwIG1vZGUgMiBpdCBrZXlzIGRvd24gdGhlIHRyYW5zbWl0dGVyIGFmdGVyICdpZGxlJyBzZWNvbmRzCisgKiBvZiBpbmFjdGl2aXR5LiBXZSB3aWxsIG5vdCByZXN0YXJ0IHRyYW5zbWlzc2lvbiBiZWZvcmUgJ21pbnRpbWUnCisgKiBleHBpcmVzLgorICovCisKK3N0YXRpYyB2b2lkIHRfaWRsZSh1bnNpZ25lZCBsb25nIGNoYW5uZWwpCit7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSAoc3RydWN0IHNjY19jaGFubmVsICopIGNoYW5uZWw7CisJCisJZGVsX3RpbWVyKCZzY2MtPnR4X3dkb2cpOworCisJc2NjX2tleV90cngoc2NjLCBUWF9PRkYpOworCWlmKHNjYy0+a2lzcy5taW50aW1lKQorCQlzY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X2R3YWl0LCBzY2MtPmtpc3MubWludGltZSoxMDApOworCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19XQUlUOworfQorCitzdGF0aWMgdm9pZCBzY2NfaW5pdF90aW1lcihzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOwkKKwlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfSURMRTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKK30KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCVNldC9nZXQgTDEgcGFyYW1ldGVycwkJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworLyoKKyAqIHRoaXMgd2lsbCBzZXQgdGhlICJoYXJkd2FyZSIgcGFyYW1ldGVycyB0aHJvdWdoIEtJU1MgY29tbWFuZHMgb3IgaW9jdGwoKQorICovCisKKyNkZWZpbmUgQ0FTVCh4KSAodW5zaWduZWQgbG9uZykoeCkKKworc3RhdGljIHVuc2lnbmVkIGludCBzY2Nfc2V0X3BhcmFtKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgYXJnKQoreworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSBQQVJBTV9UWERFTEFZOglzY2MtPmtpc3MudHhkZWxheT1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9QRVJTSVNUOglzY2MtPmtpc3MucGVyc2lzdD1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9TTE9UVElNRToJc2NjLT5raXNzLnNsb3R0aW1lPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX1RYVEFJTDoJc2NjLT5raXNzLnRhaWx0aW1lPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX0ZVTExEVVA6CXNjYy0+a2lzcy5mdWxsZHVwPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX0RUUjoJCWJyZWFrOyAvKiBkb2VzIHNvbWVvbmUgbmVlZCB0aGlzPyAqLworCQljYXNlIFBBUkFNX0dST1VQOglzY2MtPmtpc3MuZ3JvdXA9YXJnOwkJYnJlYWs7CisJCWNhc2UgUEFSQU1fSURMRToJc2NjLT5raXNzLmlkbGV0aW1lPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX01JTjoJCXNjYy0+a2lzcy5taW50aW1lPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX01BWEtFWToJc2NjLT5raXNzLm1heGtleXVwPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX1dBSVQ6CXNjYy0+a2lzcy53YWl0dGltZT1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9NQVhERUZFUjoJc2NjLT5raXNzLm1heGRlZmVyPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX1RYOgkJc2NjLT5raXNzLnR4X2luaGliaXQ9YXJnOwlicmVhazsKKworCQljYXNlIFBBUkFNX1NPRlREQ0Q6CQorCQkJc2NjLT5raXNzLnNvZnRkY2Q9YXJnOworCQkJaWYgKGFyZykKKwkJCXsKKwkJCQlvcihzY2MsIFIxNSwgU1lOQ0lFKTsKKwkJCQljbChzY2MsIFIxNSwgRENESUUpOworCQkJCXN0YXJ0X2h1bnQoc2NjKTsKKwkJCX0gZWxzZSB7CisJCQkJb3Ioc2NjLCBSMTUsIERDRElFKTsKKwkJCQljbChzY2MsIFIxNSwgU1lOQ0lFKTsKKwkJCX0KKwkJCWJyZWFrOworCQkJCQorCQljYXNlIFBBUkFNX1NQRUVEOgorCQkJaWYgKGFyZyA8IDI1NikKKwkJCQlzY2MtPm1vZGVtLnNwZWVkPWFyZyoxMDA7CisJCQllbHNlCisJCQkJc2NjLT5tb2RlbS5zcGVlZD1hcmc7CisKKwkJCWlmIChzY2MtPnN0YXQudHhfc3RhdGUgPT0gMCkJLyogb25seSBzd2l0Y2ggYmF1ZHJhdGUgb24gcnguLi4gOy0pICovCisJCQkJc2V0X3NwZWVkKHNjYyk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIFBBUkFNX1JUUzoJCisJCQlpZiAoICEoc2NjLT53cmVnW1I1XSAmIFJUUykgKQorCQkJeworCQkJCWlmIChhcmcgIT0gVFhfT0ZGKQorCQkJCQlzY2Nfa2V5X3RyeChzY2MsIFRYX09OKTsKKwkJCQkJc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF90eGRlbGF5LCBzY2MtPmtpc3MudHhkZWxheSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChhcmcgPT0gVFhfT0ZGKQorCQkJCXsKKwkJCQkJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX0JVU1k7CisJCQkJCXNjY19zdGFydF90eF90aW1lcihzY2MsIHRfdGFpbCwgc2NjLT5raXNzLnRhaWx0aW1lKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJCQorCQljYXNlIFBBUkFNX0hXRVZFTlQ6CisJCQlzY2Nfbm90aWZ5KHNjYywgc2NjLT5kY2Q/IEhXRVZfRENEX09OOkhXRVZfRENEX09GRik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCXJldHVybiAwOworfQorCisKKyAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNjY19nZXRfcGFyYW0oc3RydWN0IHNjY19jaGFubmVsICpzY2MsIHVuc2lnbmVkIGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIFBBUkFNX1RYREVMQVk6CXJldHVybiBDQVNUKHNjYy0+a2lzcy50eGRlbGF5KTsKKwkJY2FzZSBQQVJBTV9QRVJTSVNUOglyZXR1cm4gQ0FTVChzY2MtPmtpc3MucGVyc2lzdCk7CisJCWNhc2UgUEFSQU1fU0xPVFRJTUU6CXJldHVybiBDQVNUKHNjYy0+a2lzcy5zbG90dGltZSk7CisJCWNhc2UgUEFSQU1fVFhUQUlMOglyZXR1cm4gQ0FTVChzY2MtPmtpc3MudGFpbHRpbWUpOworCQljYXNlIFBBUkFNX0ZVTExEVVA6CXJldHVybiBDQVNUKHNjYy0+a2lzcy5mdWxsZHVwKTsKKwkJY2FzZSBQQVJBTV9TT0ZURENEOglyZXR1cm4gQ0FTVChzY2MtPmtpc3Muc29mdGRjZCk7CisJCWNhc2UgUEFSQU1fRFRSOgkJcmV0dXJuIENBU1QoKHNjYy0+d3JlZ1tSNV0gJiBEVFIpPyAxOjApOworCQljYXNlIFBBUkFNX1JUUzoJCXJldHVybiBDQVNUKChzY2MtPndyZWdbUjVdICYgUlRTKT8gMTowKTsKKwkJY2FzZSBQQVJBTV9TUEVFRDoJcmV0dXJuIENBU1Qoc2NjLT5tb2RlbS5zcGVlZCk7CisJCWNhc2UgUEFSQU1fR1JPVVA6CXJldHVybiBDQVNUKHNjYy0+a2lzcy5ncm91cCk7CisJCWNhc2UgUEFSQU1fSURMRToJcmV0dXJuIENBU1Qoc2NjLT5raXNzLmlkbGV0aW1lKTsKKwkJY2FzZSBQQVJBTV9NSU46CQlyZXR1cm4gQ0FTVChzY2MtPmtpc3MubWludGltZSk7CisJCWNhc2UgUEFSQU1fTUFYS0VZOglyZXR1cm4gQ0FTVChzY2MtPmtpc3MubWF4a2V5dXApOworCQljYXNlIFBBUkFNX1dBSVQ6CXJldHVybiBDQVNUKHNjYy0+a2lzcy53YWl0dGltZSk7CisJCWNhc2UgUEFSQU1fTUFYREVGRVI6CXJldHVybiBDQVNUKHNjYy0+a2lzcy5tYXhkZWZlcik7CisJCWNhc2UgUEFSQU1fVFg6CQlyZXR1cm4gQ0FTVChzY2MtPmtpc3MudHhfaW5oaWJpdCk7CisJCWRlZmF1bHQ6CQlyZXR1cm4gTk9fU1VDSF9QQVJBTTsKKwl9CisKK30KKworI3VuZGVmIENBU1QKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCVNlbmQgY2FsaWJyYXRpb24gcGF0dGVybgkJICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNjY19zdG9wX2NhbGlicmF0ZSh1bnNpZ25lZCBsb25nIGNoYW5uZWwpCit7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSAoc3RydWN0IHNjY19jaGFubmVsICopIGNoYW5uZWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CisJZGVsX3RpbWVyKCZzY2MtPnR4X3dkb2cpOworCXNjY19rZXlfdHJ4KHNjYywgVFhfT0ZGKTsKKwl3cihzY2MsIFI2LCAwKTsKKwl3cihzY2MsIFI3LCBGTEFHKTsKKwlPdXRiKHNjYy0+Y3RybCxSRVNfRVhUX0lOVCk7CS8qIHJlc2V0IGV4dC9zdGF0dXMgaW50ZXJydXB0cyAqLworCU91dGIoc2NjLT5jdHJsLFJFU19FWFRfSU5UKTsKKworCW5ldGlmX3dha2VfcXVldWUoc2NjLT5kZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkCitzY2Nfc3RhcnRfY2FsaWJyYXRlKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCBpbnQgZHVyYXRpb24sIHVuc2lnbmVkIGNoYXIgcGF0dGVybikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzY2MtPmxvY2ssIGZsYWdzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKHNjYy0+ZGV2KTsKKwlzY2NfZGlzY2FyZF9idWZmZXJzKHNjYyk7CisKKwlkZWxfdGltZXIoJnNjYy0+dHhfd2RvZyk7CisKKwlzY2MtPnR4X3dkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzY2M7CisJc2NjLT50eF93ZG9nLmZ1bmN0aW9uID0gc2NjX3N0b3BfY2FsaWJyYXRlOworCXNjYy0+dHhfd2RvZy5leHBpcmVzID0gamlmZmllcyArIEhaKmR1cmF0aW9uOworCWFkZF90aW1lcigmc2NjLT50eF93ZG9nKTsKKworCS8qIFRoaXMgZG9lc24ndCBzZWVtIHRvIHdvcmsuIFdoeSBub3Q/ICovCQorCXdyKHNjYywgUjYsIDApOworCXdyKHNjYywgUjcsIHBhdHRlcm4pOworCisJLyogCisJICogRG9uJ3Qga25vdyBpZiB0aGlzIHdvcmtzLiAKKwkgKiBEYW1uLCB3aGVyZSBpcyBteSBaODUzMCBwcm9ncmFtbWluZyBtYW51YWwuLi4/IAorCSAqLworCisJT3V0YihzY2MtPmN0cmwsUkVTX0VYVF9JTlQpOwkvKiByZXNldCBleHQvc3RhdHVzIGludGVycnVwdHMgKi8KKwlPdXRiKHNjYy0+Y3RybCxSRVNfRVhUX0lOVCk7CisKKwlzY2Nfa2V5X3RyeChzY2MsIFRYX09OKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJSW5pdCBjaGFubmVsIHN0cnVjdHVyZXMsIHNwZWNpYWwgSFcsIGV0Yy4uLgkgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyoKKyAqIFJlc2V0IHRoZSBaODUzMHMgYW5kIHNldHVwIHNwZWNpYWwgaGFyZHdhcmUKKyAqLworCitzdGF0aWMgdm9pZCB6ODUzMF9pbml0KHZvaWQpCit7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2M7CisJaW50IGNoaXAsIGs7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyICpmbGFnOworCisKKwlwcmludGsoS0VSTl9JTkZPICJJbml0IFo4NTMwIGRyaXZlcjogJXUgY2hhbm5lbHMsIElSUSIsIE5jaGlwcyoyKTsKKwkKKwlmbGFnPSIgIjsKKwlmb3IgKGsgPSAwOyBrIDwgTlJfSVJRUzsgaysrKQorCQlpZiAoSXZlY1trXS51c2VkKSAKKwkJeworCQkJcHJpbnRrKCIlcyVkIiwgZmxhZywgayk7CisJCQlmbGFnPSIsIjsKKwkJfQorCXByaW50aygiXG4iKTsKKworCisJLyogcmVzZXQgYW5kIHByZS1pbml0IGFsbCBjaGlwcyBpbiB0aGUgc3lzdGVtICovCisJZm9yIChjaGlwID0gMDsgY2hpcCA8IE5jaGlwczsgY2hpcCsrKQorCXsKKwkJc2NjPSZTQ0NfSW5mb1syKmNoaXBdOworCQlpZiAoIXNjYy0+Y3RybCkgY29udGludWU7CisKKwkJLyogU3BlY2lhbCBTQ0MgY2FyZHMgKi8KKworCQlpZihzY2MtPmJyYW5kICYgRUFHTEUpCQkJLyogdGhpcyBpcyBhbiBFQUdMRSBjYXJkICovCisJCQlPdXRiKHNjYy0+c3BlY2lhbCwweDA4KTsJLyogZW5hYmxlIGludGVycnVwdCBvbiB0aGUgYm9hcmQgKi8KKwkJCQorCQlpZihzY2MtPmJyYW5kICYgKFBDMTAwIHwgUFJJTVVTKSkJLyogdGhpcyBpcyBhIFBDMTAwL1BSSU1VUyBjYXJkICovCisJCQlPdXRiKHNjYy0+c3BlY2lhbCxzY2MtPm9wdGlvbik7CS8qIHNldCB0aGUgTU9ERU0gbW9kZSAoMHgyMikgKi8KKworCQkJCisJCS8qIFJlc2V0IGFuZCBwcmUtaW5pdCBaODUzMCAqLworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzY2MtPmxvY2ssIGZsYWdzKTsKKwkJCQkKKwkJT3V0YihzY2MtPmN0cmwsIDApOworCQlPdXRSZWcoc2NjLT5jdHJsLFI5LEZIV1JFUyk7CQkvKiBmb3JjZSBoYXJkd2FyZSByZXNldCAqLworCQl1ZGVsYXkoMTAwKTsJCQkJLyogZ2l2ZSBpdCAnYSBiaXQnIG1vcmUgdGltZSB0aGFuIHJlcXVpcmVkICovCisJCXdyKHNjYywgUjIsIGNoaXAqMTYpOwkJCS8qIGludGVycnVwdCB2ZWN0b3IgKi8KKwkJd3Ioc2NjLCBSOSwgVklTKTsJCQkvKiB2ZWN0b3IgaW5jbHVkZXMgc3RhdHVzICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOwkJCisgICAgICAgIH0KKworIAorCURyaXZlcl9Jbml0aWFsaXplZCA9IDE7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlLCBlcnIsIGluc3RhbmNlLCBhbmQgcmVnaXN0ZXIgZHJpdmVyCisgKi8KKworc3RhdGljIGludCBzY2NfbmV0X2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCWludCBlcnI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWRldiA9IGFsbG9jX25ldGRldigwLCBuYW1lLCBzY2NfbmV0X3NldHVwKTsKKwlpZiAoIWRldikgCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2LT5wcml2ID0gc2NjOworCXNjYy0+ZGV2ID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZzY2MtPmxvY2spOworCWluaXRfdGltZXIoJnNjYy0+dHhfdCk7CisJaW5pdF90aW1lcigmc2NjLT50eF93ZG9nKTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgcmVnaXN0ZXIgbmV0d29yayBkZXZpY2UgKCVkKVxuIiwgCisJCSAgICAgICBuYW1lLCBlcnIpOworCQlmcmVlX25ldGRldihkZXYpOworCQlzY2MtPmRldiA9IE5VTEw7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCSAgICBOZXR3b3JrIGRyaXZlciBtZXRob2RzCQkgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBheDI1X2JjYXN0W0FYMjVfQUREUl9MRU5dID0KK3snUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnMCcgPDwgMX07CitzdGF0aWMgdW5zaWduZWQgY2hhciBheDI1X25vY2FsbFtBWDI1X0FERFJfTEVOXSA9Cit7J0wnIDw8IDEsICdJJyA8PCAxLCAnTicgPDwgMSwgJ1UnIDw8IDEsICdYJyA8PCAxLCAnICcgPDwgMSwgJzEnIDw8IDF9OworCisvKiAtLS0tPiBJbml0aWFsaXplIGRldmljZSA8LS0tLS0gKi8KKworc3RhdGljIHZvaWQgc2NjX25ldF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlkZXYtPnR4X3F1ZXVlX2xlbiAgICA9IDE2OwkvKiBzaG91bGQgYmUgZW5vdWdoLi4uICovCisKKwlkZXYtPm9wZW4gICAgICAgICAgICA9IHNjY19uZXRfb3BlbjsKKwlkZXYtPnN0b3AJICAgICA9IHNjY19uZXRfY2xvc2U7CisKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNjY19uZXRfdHg7CisJZGV2LT5oYXJkX2hlYWRlciAgICAgPSBheDI1X2VuY2Fwc3VsYXRlOworCWRldi0+cmVidWlsZF9oZWFkZXIgID0gYXgyNV9yZWJ1aWxkX2hlYWRlcjsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IHNjY19uZXRfc2V0X21hY19hZGRyZXNzOworCWRldi0+Z2V0X3N0YXRzICAgICAgID0gc2NjX25ldF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCAgICAgICAgPSBzY2NfbmV0X2lvY3RsOworCWRldi0+dHhfdGltZW91dCAgICAgID0gTlVMTDsKKworCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgYXgyNV9iY2FzdCwgIEFYMjVfQUREUl9MRU4pOworCW1lbWNweShkZXYtPmRldl9hZGRyLCAgYXgyNV9ub2NhbGwsIEFYMjVfQUREUl9MRU4pOworIAorCWRldi0+ZmxhZ3MgICAgICA9IDA7CisKKwlkZXYtPnR5cGUgPSBBUlBIUkRfQVgyNTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IEFYMjVfTUFYX0hFQURFUl9MRU4gKyBBWDI1X0JQUV9IRUFERVJfTEVOOworCWRldi0+bXR1ID0gQVgyNV9ERUZfUEFDTEVOOworCWRldi0+YWRkcl9sZW4gPSBBWDI1X0FERFJfTEVOOworCit9CisKKy8qIC0tLS0+IG9wZW4gbmV0d29yayBkZXZpY2UgPC0tLS0gKi8KKworc3RhdGljIGludCBzY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgZGV2LT5wcml2OworCisgCWlmICghc2NjLT5pbml0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNjYy0+dHhfYnVmZiA9IE5VTEw7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2NjLT50eF9xdWV1ZSk7CisgCisJaW5pdF9jaGFubmVsKHNjYyk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKiAtLS0tPiBjbG9zZSBuZXR3b3JrIGRldmljZSA8LS0tLSAqLworCitzdGF0aWMgaW50IHNjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CQorCU91dGIoc2NjLT5jdHJsLDApOwkJLyogTWFrZSBzdXJlIHBvaW50ZXIgaXMgd3JpdHRlbiAqLworCXdyKHNjYyxSMSwwKTsJCQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwl3cihzY2MsUjMsMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NjLT5sb2NrLCBmbGFncyk7CisKKwlkZWxfdGltZXJfc3luYygmc2NjLT50eF90KTsKKwlkZWxfdGltZXJfc3luYygmc2NjLT50eF93ZG9nKTsKKwkKKwlzY2NfZGlzY2FyZF9idWZmZXJzKHNjYyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLT4gcmVjZWl2ZSBmcmFtZSwgY2FsbGVkIGZyb20gc2NjX3J4aW50KCkgPC0tLS0gKi8KKworc3RhdGljIHZvaWQgc2NjX25ldF9yeChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoc2tiLT5sZW4gPT0gMCkgeworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlyZXR1cm47CisJfQorCQkKKwlzY2MtPmRldl9zdGF0LnJ4X3BhY2tldHMrKzsKKwlzY2MtPmRldl9zdGF0LnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisJc2tiLT5kZXYgICAgICA9IHNjYy0+ZGV2OworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BWDI1KTsKKwlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwkKKwluZXRpZl9yeChza2IpOworCXNjYy0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlyZXR1cm47Cit9CisKKy8qIC0tLS0+IHRyYW5zbWl0IGZyYW1lIDwtLS0tICovCisKK3N0YXRpYyBpbnQgc2NjX25ldF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjID0gKHN0cnVjdCBzY2NfY2hhbm5lbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyIGtpc3NjbWQ7CisKKwlpZiAoc2tiLT5sZW4gPiBzY2MtPnN0YXQuYnVmc2l6ZSB8fCBza2ItPmxlbiA8IDIpIHsKKwkJc2NjLT5kZXZfc3RhdC50eF9kcm9wcGVkKys7CS8qIGJvZ3VzIGZyYW1lICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCXNjYy0+ZGV2X3N0YXQudHhfcGFja2V0cysrOworCXNjYy0+ZGV2X3N0YXQudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJc2NjLT5zdGF0LnR4ZnJhbWVzKys7CisJCisJa2lzc2NtZCA9ICpza2ItPmRhdGEgJiAweDFmOworCXNrYl9wdWxsKHNrYiwgMSk7CisKKwlpZiAoa2lzc2NtZCkgeworCQlzY2Nfc2V0X3BhcmFtKHNjYywga2lzc2NtZCwgKnNrYi0+ZGF0YSk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOworCQkKKwlpZiAoc2tiX3F1ZXVlX2xlbigmc2NjLT50eF9xdWV1ZSkgPiBzY2MtPmRldi0+dHhfcXVldWVfbGVuKSB7CisJCXN0cnVjdCBza19idWZmICpza2JfZGVsOworCQlza2JfZGVsID0gc2tiX2RlcXVldWUoJnNjYy0+dHhfcXVldWUpOworCQlkZXZfa2ZyZWVfc2tiKHNrYl9kZWwpOworCX0KKwlza2JfcXVldWVfdGFpbCgmc2NjLT50eF9xdWV1ZSwgc2tiKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkKKworCS8qCisJICogU3RhcnQgdHJhbnNtaXNzaW9uIGlmIHRoZSB0cnggc3RhdGUgaXMgaWRsZSBvcgorCSAqIHRfaWRsZSBoYXNuJ3QgZXhwaXJlZCB5ZXQuIFVzZSBkd2FpdC9wZXJzaXN0ZW5jZS9zbG90dGltZQorCSAqIGFsZ29yaXRobSBmb3Igbm9ybWFsIGhhbGZkdXBsZXggb3BlcmF0aW9uLgorCSAqLworCisJaWYoc2NjLT5zdGF0LnR4X3N0YXRlID09IFRYU19JRExFIHx8IHNjYy0+c3RhdC50eF9zdGF0ZSA9PSBUWFNfSURMRTIpIHsKKwkJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX0JVU1k7CisJCWlmIChzY2MtPmtpc3MuZnVsbGR1cCA9PSBLSVNTX0RVUExFWF9IQUxGKQorCQkJX19zY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X2R3YWl0LCBzY2MtPmtpc3Mud2FpdHRpbWUpOworCQllbHNlCisJCQlfX3NjY19zdGFydF90eF90aW1lcihzY2MsIHRfZHdhaXQsIDApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLT4gaW9jdGwgZnVuY3Rpb25zIDwtLS0tICovCisKKy8qCisgKiBTSU9DU0NDQ0ZHCQktIGNvbmZpZ3VyZSBkcml2ZXIJYXJnOiAoc3RydWN0IHNjY19od19jb25maWcgKikgYXJnCisgKiBTSU9DU0NDSU5JCQktIGluaXRpYWxpemUgZHJpdmVyCWFyZzogLS0tCisgKiBTSU9DU0NDQ0hBTklOSQktIGluaXRpYWxpemUgY2hhbm5lbAlhcmc6IChzdHJ1Y3Qgc2NjX21vZGVtICopIGFyZworICogU0lPQ1NDQ1NNRU0JCS0gc2V0IG1lbW9yeQkJYXJnOiAoc3RydWN0IHNjY19tZW1fY29uZmlnICopIGFyZworICogU0lPQ1NDQ0dLSVNTCQktIGdldCBsZXZlbCAxIHBhcmFtZXRlcglhcmc6IChzdHJ1Y3Qgc2NjX2tpc3NfY21kICopIGFyZworICogU0lPQ1NDQ1NLSVNTCQktIHNldCBsZXZlbCAxIHBhcmFtZXRlciBhcmc6IChzdHJ1Y3Qgc2NjX2tpc3NfY21kICopIGFyZworICogU0lPQ1NDQ0dTVEFUCQktIGdldCBkcml2ZXIgc3RhdHVzCWFyZzogKHN0cnVjdCBzY2Nfc3RhdCAqKSBhcmcKKyAqIFNJT0NTQ0NDQUwJCS0gc2VuZCBjYWxpYi4gcGF0dGVybglhcmc6IChzdHJ1Y3Qgc2NjX2NhbGlicmF0ZSAqKSBhcmcKKyAqLworCitzdGF0aWMgaW50IHNjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IHNjY19raXNzX2NtZCBraXNzX2NtZDsKKwlzdHJ1Y3Qgc2NjX21lbV9jb25maWcgbWVtY2ZnOworCXN0cnVjdCBzY2NfaHdfY29uZmlnIGh3Y2ZnOworCXN0cnVjdCBzY2NfY2FsaWJyYXRlIGNhbDsKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgZGV2LT5wcml2OworCWludCBjaGFuOworCXVuc2lnbmVkIGNoYXIgZGV2aWNlX25hbWVbSUZOQU1TSVpdOworCXZvaWQgX191c2VyICphcmcgPSBpZnItPmlmcl9kYXRhOworCQorCQorCWlmICghRHJpdmVyX0luaXRpYWxpemVkKQorCXsKKwkJaWYgKGNtZCA9PSBTSU9DU0NDQ0ZHKQorCQl7CisJCQlpbnQgZm91bmQgPSAxOworCisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpIHJldHVybiAtRVBFUk07CisJCQlpZiAoIWFyZykgcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChOY2hpcHMgPj0gU0NDX01BWENISVBTKSAKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZod2NmZywgYXJnLCBzaXplb2YoaHdjZmcpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKGh3Y2ZnLmlycSA9PSAyKSBod2NmZy5pcnEgPSA5OworCisJCQlpZiAoaHdjZmcuaXJxIDwgMCB8fCBod2NmZy5pcnEgPj0gTlJfSVJRUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkKKwkJCWlmICghSXZlY1tod2NmZy5pcnFdLnVzZWQgJiYgaHdjZmcuaXJxKQorCQkJeworCQkJCWlmIChyZXF1ZXN0X2lycShod2NmZy5pcnEsIHNjY19pc3IsIFNBX0lOVEVSUlVQVCwgIkFYLjI1IFNDQyIsIE5VTEwpKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ6ODUzMGRydjogd2FybmluZywgY2Fubm90IGdldCBJUlEgJWRcbiIsIGh3Y2ZnLmlycSk7CisJCQkJZWxzZQorCQkJCQlJdmVjW2h3Y2ZnLmlycV0udXNlZCA9IDE7CisJCQl9CisKKwkJCWlmIChod2NmZy52ZWN0b3JfbGF0Y2ggJiYgIVZlY3Rvcl9MYXRjaCkgeworCQkJCWlmICghcmVxdWVzdF9yZWdpb24oaHdjZmcudmVjdG9yX2xhdGNoLCAxLCAic2NjIHZlY3RvciBsYXRjaCIpKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ6ODUzMGRydjogd2FybmluZywgY2Fubm90IHJlc2VydmUgdmVjdG9yIGxhdGNoIHBvcnQgMHglbHhcbiwgZGlzYWJsZWQuIiwgaHdjZmcudmVjdG9yX2xhdGNoKTsKKwkJCQllbHNlCisJCQkJCVZlY3Rvcl9MYXRjaCA9IGh3Y2ZnLnZlY3Rvcl9sYXRjaDsKKwkJCX0KKworCQkJaWYgKGh3Y2ZnLmNsb2NrID09IDApCisJCQkJaHdjZmcuY2xvY2sgPSBTQ0NfREVGQVVMVF9DTE9DSzsKKworI2lmbmRlZiBTQ0NfRE9OVF9DSEVDSworCisJCQlpZihyZXF1ZXN0X3JlZ2lvbihod2NmZy5jdHJsX2EsIDEsICJzY2MtcHJvYmUiKSkKKwkJCXsKKwkJCQlkaXNhYmxlX2lycShod2NmZy5pcnEpOworCQkJCU91dGIoaHdjZmcuY3RybF9hLCAwKTsKKwkJCQlPdXRSZWcoaHdjZmcuY3RybF9hLCBSOSwgRkhXUkVTKTsKKwkJCQl1ZGVsYXkoMTAwKTsKKwkJCQlPdXRSZWcoaHdjZmcuY3RybF9hLFIxMywweDU1KTsJCS8qIGlzIHRoaXMgY2hpcCByZWFsbHkgdGhlcmU/ICovCisJCQkJdWRlbGF5KDUpOworCisJCQkJaWYgKEluUmVnKGh3Y2ZnLmN0cmxfYSxSMTMpICE9IDB4NTUpCisJCQkJCWZvdW5kID0gMDsKKwkJCQllbmFibGVfaXJxKGh3Y2ZnLmlycSk7CisJCQkJcmVsZWFzZV9yZWdpb24oaHdjZmcuY3RybF9hLCAxKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlmb3VuZCA9IDA7CisjZW5kaWYKKworCQkJaWYgKGZvdW5kKQorCQkJeworCQkJCVNDQ19JbmZvWzIqTmNoaXBzICBdLmN0cmwgPSBod2NmZy5jdHJsX2E7CisJCQkJU0NDX0luZm9bMipOY2hpcHMgIF0uZGF0YSA9IGh3Y2ZnLmRhdGFfYTsKKwkJCQlTQ0NfSW5mb1syKk5jaGlwcyAgXS5pcnEgID0gaHdjZmcuaXJxOworCQkJCVNDQ19JbmZvWzIqTmNoaXBzKzFdLmN0cmwgPSBod2NmZy5jdHJsX2I7CisJCQkJU0NDX0luZm9bMipOY2hpcHMrMV0uZGF0YSA9IGh3Y2ZnLmRhdGFfYjsKKwkJCQlTQ0NfSW5mb1syKk5jaGlwcysxXS5pcnEgID0gaHdjZmcuaXJxOworCQkJCisJCQkJU0NDX2N0cmxbTmNoaXBzXS5jaGFuX0EgPSBod2NmZy5jdHJsX2E7CisJCQkJU0NDX2N0cmxbTmNoaXBzXS5jaGFuX0IgPSBod2NmZy5jdHJsX2I7CisJCQkJU0NDX2N0cmxbTmNoaXBzXS5pcnEgICAgPSBod2NmZy5pcnE7CisJCQl9CisKKworCQkJZm9yIChjaGFuID0gMDsgY2hhbiA8IDI7IGNoYW4rKykKKwkJCXsKKwkJCQlzcHJpbnRmKGRldmljZV9uYW1lLCAiJXMlaSIsIFNDQ19Ecml2ZXJOYW1lLCAyKk5jaGlwcytjaGFuKTsKKworCQkJCVNDQ19JbmZvWzIqTmNoaXBzK2NoYW5dLnNwZWNpYWwgPSBod2NmZy5zcGVjaWFsOworCQkJCVNDQ19JbmZvWzIqTmNoaXBzK2NoYW5dLmNsb2NrID0gaHdjZmcuY2xvY2s7CisJCQkJU0NDX0luZm9bMipOY2hpcHMrY2hhbl0uYnJhbmQgPSBod2NmZy5icmFuZDsKKwkJCQlTQ0NfSW5mb1syKk5jaGlwcytjaGFuXS5vcHRpb24gPSBod2NmZy5vcHRpb247CisJCQkJU0NDX0luZm9bMipOY2hpcHMrY2hhbl0uZW5oYW5jZWQgPSBod2NmZy5lc2NjOworCisjaWZkZWYgU0NDX0RPTlRfQ0hFQ0sKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogZGF0YSBwb3J0ID0gMHglMy4zeCAgY29udHJvbCBwb3J0ID0gMHglMy4zeFxuIiwKKwkJCQkJZGV2aWNlX25hbWUsIAorCQkJCQlTQ0NfSW5mb1syKk5jaGlwcytjaGFuXS5kYXRhLCAKKwkJCQkJU0NDX0luZm9bMipOY2hpcHMrY2hhbl0uY3RybCk7CisKKyNlbHNlCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGRhdGEgcG9ydCA9IDB4JTMuM2x4ICBjb250cm9sIHBvcnQgPSAweCUzLjNseCAtLSAlc1xuIiwKKwkJCQkJZGV2aWNlX25hbWUsCisJCQkJCWNoYW4/IGh3Y2ZnLmRhdGFfYiA6IGh3Y2ZnLmRhdGFfYSwgCisJCQkJCWNoYW4/IGh3Y2ZnLmN0cmxfYiA6IGh3Y2ZnLmN0cmxfYSwKKwkJCQkJZm91bmQ/ICJmb3VuZCIgOiAibWlzc2luZyIpOworI2VuZGlmCisKKwkJCQlpZiAoZm91bmQpCisJCQkJeworCQkJCQlyZXF1ZXN0X3JlZ2lvbihTQ0NfSW5mb1syKk5jaGlwcytjaGFuXS5jdHJsLCAxLCAic2NjIGN0cmwiKTsKKwkJCQkJcmVxdWVzdF9yZWdpb24oU0NDX0luZm9bMipOY2hpcHMrY2hhbl0uZGF0YSwgMSwgInNjYyBkYXRhIik7CisJCQkJCWlmIChOY2hpcHMrY2hhbiAhPSAwICYmCisJCQkJCSAgICBzY2NfbmV0X2FsbG9jKGRldmljZV9uYW1lLCAKKwkJCQkJCQkgICZTQ0NfSW5mb1syKk5jaGlwcytjaGFuXSkpCisJCQkJCSAgICByZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmIChmb3VuZCkgTmNoaXBzKys7CisJCQkKKwkJCXJldHVybiAwOworCQl9CisJCQorCQlpZiAoY21kID09IFNJT0NTQ0NJTkkpCisJCXsKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJCQorCQkJaWYgKE5jaGlwcyA9PSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl6ODUzMF9pbml0KCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIGNvbmZ1c2UgdGhlIHVzZXIgKi8KKwl9CisJCisJaWYgKCFzY2MtPmluaXQpCisJeworCQlpZiAoY21kID09IFNJT0NTQ0NDSEFOSU5JKQorCQl7CisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldHVybiAtRVBFUk07CisJCQlpZiAoIWFyZykgcmV0dXJuIC1FSU5WQUw7CisJCQkKKwkJCXNjYy0+c3RhdC5idWZzaXplICAgPSBTQ0NfQlVGU0laRTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzY2MtPm1vZGVtLCBhcmcsIHNpemVvZihzdHJ1Y3Qgc2NjX21vZGVtKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkKKwkJCS8qIGRlZmF1bHQgS0lTUyBQYXJhbXMgKi8KKwkJCisJCQlpZiAoc2NjLT5tb2RlbS5zcGVlZCA8IDQ4MDApCisJCQl7CisJCQkJc2NjLT5raXNzLnR4ZGVsYXkgPSAzNjsJCS8qIDM2MCBtcyAqLworCQkJCXNjYy0+a2lzcy5wZXJzaXN0ID0gNDI7CQkvKiAyNSUgcGVyc2lzdGVuY2UgKi8JCQkvKiB3YXMgMjUgKi8KKwkJCQlzY2MtPmtpc3Muc2xvdHRpbWUgPSAxNjsJLyogMTYwIG1zICovCisJCQkJc2NjLT5raXNzLnRhaWx0aW1lID0gNDsJCS8qIG1pbmltYWwgcmVhc29uYWJsZSB2YWx1ZSAqLworCQkJCXNjYy0+a2lzcy5mdWxsZHVwID0gMDsJCS8qIENTTUEgKi8KKwkJCQlzY2MtPmtpc3Mud2FpdHRpbWUgPSA1MDsJLyogNTAwIG1zICovCisJCQkJc2NjLT5raXNzLm1heGtleXVwID0gMTA7CS8qIDEwIHMgKi8KKwkJCQlzY2MtPmtpc3MubWludGltZSA9IDM7CQkvKiAzIHMgKi8KKwkJCQlzY2MtPmtpc3MuaWRsZXRpbWUgPSAzMDsJLyogMzAgcyAqLworCQkJCXNjYy0+a2lzcy5tYXhkZWZlciA9IDEyMDsJLyogMiBtaW4gKi8KKwkJCQlzY2MtPmtpc3Muc29mdGRjZCA9IDA7CQkvKiBoYXJkd2FyZSBkY2QgKi8KKwkJCX0gZWxzZSB7CisJCQkJc2NjLT5raXNzLnR4ZGVsYXkgPSAxMDsJCS8qIDEwMCBtcyAqLworCQkJCXNjYy0+a2lzcy5wZXJzaXN0ID0gNjQ7CQkvKiAyNSUgcGVyc2lzdGVuY2UgKi8JCQkvKiB3YXMgMjUgKi8KKwkJCQlzY2MtPmtpc3Muc2xvdHRpbWUgPSA4OwkJLyogMTYwIG1zICovCisJCQkJc2NjLT5raXNzLnRhaWx0aW1lID0gMTsJCS8qIG1pbmltYWwgcmVhc29uYWJsZSB2YWx1ZSAqLworCQkJCXNjYy0+a2lzcy5mdWxsZHVwID0gMDsJCS8qIENTTUEgKi8KKwkJCQlzY2MtPmtpc3Mud2FpdHRpbWUgPSA1MDsJLyogNTAwIG1zICovCisJCQkJc2NjLT5raXNzLm1heGtleXVwID0gNzsJCS8qIDcgcyAqLworCQkJCXNjYy0+a2lzcy5taW50aW1lID0gMzsJCS8qIDMgcyAqLworCQkJCXNjYy0+a2lzcy5pZGxldGltZSA9IDMwOwkvKiAzMCBzICovCisJCQkJc2NjLT5raXNzLm1heGRlZmVyID0gMTIwOwkvKiAyIG1pbiAqLworCQkJCXNjYy0+a2lzcy5zb2Z0ZGNkID0gMDsJCS8qIGhhcmR3YXJlIGRjZCAqLworCQkJfQorCQkJCisJCQlzY2MtPnR4X2J1ZmYgPSBOVUxMOworCQkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2NjLT50eF9xdWV1ZSk7CisJCQlzY2MtPmluaXQgPSAxOworCQkJCisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCXN3aXRjaChjbWQpCisJeworCQljYXNlIFNJT0NTQ0NSRVNFUlZFRDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwkJY2FzZSBTSU9DU0NDU01FTToKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkgcmV0dXJuIC1FUEVSTTsKKwkJCWlmICghYXJnIHx8IGNvcHlfZnJvbV91c2VyKCZtZW1jZmcsIGFyZywgc2l6ZW9mKG1lbWNmZykpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc2NjLT5zdGF0LmJ1ZnNpemUgICA9IG1lbWNmZy5idWZzaXplOworCQkJcmV0dXJuIDA7CisJCQorCQljYXNlIFNJT0NTQ0NHU1RBVDoKKwkJCWlmICghYXJnIHx8IGNvcHlfdG9fdXNlcihhcmcsICZzY2MtPnN0YXQsIHNpemVvZihzY2MtPnN0YXQpKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQkKKwkJY2FzZSBTSU9DU0NDR0tJU1M6CisJCQlpZiAoIWFyZyB8fCBjb3B5X2Zyb21fdXNlcigma2lzc19jbWQsIGFyZywgc2l6ZW9mKGtpc3NfY21kKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlraXNzX2NtZC5wYXJhbSA9IHNjY19nZXRfcGFyYW0oc2NjLCBraXNzX2NtZC5jb21tYW5kKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAma2lzc19jbWQsIHNpemVvZihraXNzX2NtZCkpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCQorCQljYXNlIFNJT0NTQ0NTS0lTUzoKKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwkJCWlmICghYXJnIHx8IGNvcHlfZnJvbV91c2VyKCZraXNzX2NtZCwgYXJnLCBzaXplb2Yoa2lzc19jbWQpKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBzY2Nfc2V0X3BhcmFtKHNjYywga2lzc19jbWQuY29tbWFuZCwga2lzc19jbWQucGFyYW0pOworCQkKKwkJY2FzZSBTSU9DU0NDQ0FMOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKSByZXR1cm4gLUVQRVJNOworCQkJaWYgKCFhcmcgfHwgY29weV9mcm9tX3VzZXIoJmNhbCwgYXJnLCBzaXplb2YoY2FsKSkgfHwgY2FsLnRpbWUgPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJc2NjX3N0YXJ0X2NhbGlicmF0ZShzY2MsIGNhbC50aW1lLCBjYWwucGF0dGVybik7CisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJCisJfQorCQorCXJldHVybiAtRUlOVkFMOworfQorCisvKiAtLS0tPiBzZXQgaW50ZXJmYWNlIGNhbGxzaWduIDwtLS0tICovCisKK3N0YXRpYyBpbnQgc2NjX25ldF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSBhZGRyOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBzYS0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0+IGdldCBzdGF0aXN0aWNzIDwtLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2NjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgZGV2LT5wcml2OworCQorCXNjYy0+ZGV2X3N0YXQucnhfZXJyb3JzID0gc2NjLT5zdGF0LnJ4ZXJycyArIHNjYy0+c3RhdC5yeF9vdmVyOworCXNjYy0+ZGV2X3N0YXQudHhfZXJyb3JzID0gc2NjLT5zdGF0LnR4ZXJycyArIHNjYy0+c3RhdC50eF91bmRlcjsKKwlzY2MtPmRldl9zdGF0LnJ4X2ZpZm9fZXJyb3JzID0gc2NjLT5zdGF0LnJ4X292ZXI7CisJc2NjLT5kZXZfc3RhdC50eF9maWZvX2Vycm9ycyA9IHNjYy0+c3RhdC50eF91bmRlcjsKKworCXJldHVybiAmc2NjLT5kZXZfc3RhdDsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoJCWR1bXAgc3RhdGlzdGljcyB0byAvcHJvYy9uZXQvejg1MzBkcnYJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjX25ldF9zZXFfaWR4KGxvZmZfdCBwb3MpCit7CisJaW50IGs7CisKKwlmb3IgKGsgPSAwOyBrIDwgTmNoaXBzKjI7ICsraykgeworCQlpZiAoIVNDQ19JbmZvW2tdLmluaXQpIAorCQkJY29udGludWU7CisJCWlmIChwb3MtLSA9PSAwKQorCQkJcmV0dXJuICZTQ0NfSW5mb1trXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpzY2NfbmV0X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmV0dXJuICpwb3MgPyBzY2NfbmV0X3NlcV9pZHgoKnBvcyAtIDEpIDogU0VRX1NUQVJUX1RPS0VOOworCQorfQorCitzdGF0aWMgdm9pZCAqc2NjX25ldF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJdW5zaWduZWQgazsKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IHY7CisJKysqcG9zOworCQorCWZvciAoayA9ICh2ID09IFNFUV9TVEFSVF9UT0tFTikgPyAwIDogKHNjYyAtIFNDQ19JbmZvKSsxOworCSAgICAgayA8IE5jaGlwcyoyOyArK2spIHsKKwkJaWYgKFNDQ19JbmZvW2tdLmluaXQpIAorCQkJcmV0dXJuICZTQ0NfSW5mb1trXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNjY19uZXRfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7Cit9CisKK3N0YXRpYyBpbnQgc2NjX25ldF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3B1dHMoc2VxLCAiejg1MzBkcnYtIlZFUlNJT04iXG4iKTsKKwl9IGVsc2UgaWYgKCFEcml2ZXJfSW5pdGlhbGl6ZWQpIHsKKwkJc2VxX3B1dHMoc2VxLCAibm90IGluaXRpYWxpemVkXG4iKTsKKwl9IGVsc2UgaWYgKCFOY2hpcHMpIHsKKwkJc2VxX3B1dHMoc2VxLCAiY2hpcHMgbWlzc2luZ1xuIik7CisJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSB2OworCQljb25zdCBzdHJ1Y3Qgc2NjX3N0YXQgKnN0YXQgPSAmc2NjLT5zdGF0OworCQljb25zdCBzdHJ1Y3Qgc2NjX2tpc3MgKmtpc3MgPSAmc2NjLT5raXNzOworCisKKwkJLyogZGV2CWRhdGEgY3RybCBpcnEgY2xvY2sgYnJhbmQgZW5oIHZlY3RvciBzcGVjaWFsIG9wdGlvbiAKKwkJICoJYmF1ZCBucnogY2xvY2tzcmMgc29mdGRjZCBidWZzaXplCisJCSAqCXJ4aW50cyB0eGludHMgZXhpbnRzIHNwaW50cworCQkgKglyY3ZkIHJ4ZXJycyBvdmVyIC8geG1pdCB0eGVycnMgdW5kZXIgLyBub3NwYWNlIGJ1ZnNpemUKKwkJICoJdHhkIHBlcnMgc2xvdCB0YWlsIGZ1bCB3YWl0IG1pbiBtYXhrIGlkbCBkZWZyIHR4b2YgZ3JwCisJCSAqCVcgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMKKwkJICoJUiAjIyAjIyBYWCAjIyAjIyAjIyAjIyAjIyBYWCAjIyAjIyAjIyAjIyAjIyAjIyAjIworCQkgKi8KKworCQlzZXFfcHJpbnRmKHNlcSwgIiVzXHQlMy4zbHggJTMuM2x4ICVkICVsdSAlMi4yeCAlZCAlMy4zbHggJTMuM2x4ICVkXG4iLAorCQkJCXNjYy0+ZGV2LT5uYW1lLAorCQkJCXNjYy0+ZGF0YSwgc2NjLT5jdHJsLCBzY2MtPmlycSwgc2NjLT5jbG9jaywgc2NjLT5icmFuZCwKKwkJCQlzY2MtPmVuaGFuY2VkLCBWZWN0b3JfTGF0Y2gsIHNjYy0+c3BlY2lhbCwKKwkJCQlzY2MtPm9wdGlvbik7CisJCXNlcV9wcmludGYoc2VxLCAiXHQlbHUgJWQgJWQgJWQgJWRcbiIsCisJCQkJc2NjLT5tb2RlbS5zcGVlZCwgc2NjLT5tb2RlbS5ucnosCisJCQkJc2NjLT5tb2RlbS5jbG9ja3NyYywga2lzcy0+c29mdGRjZCwKKwkJCQlzdGF0LT5idWZzaXplKTsKKwkJc2VxX3ByaW50ZihzZXEsICJcdCVsdSAlbHUgJWx1ICVsdVxuIiwKKwkJCQlzdGF0LT5yeGludHMsIHN0YXQtPnR4aW50cywgc3RhdC0+ZXhpbnRzLCBzdGF0LT5zcGludHMpOworCQlzZXFfcHJpbnRmKHNlcSwgIlx0JWx1ICVsdSAlZCAvICVsdSAlbHUgJWQgLyAlZCAlZFxuIiwKKwkJCQlzdGF0LT5yeGZyYW1lcywgc3RhdC0+cnhlcnJzLCBzdGF0LT5yeF9vdmVyLAorCQkJCXN0YXQtPnR4ZnJhbWVzLCBzdGF0LT50eGVycnMsIHN0YXQtPnR4X3VuZGVyLAorCQkJCXN0YXQtPm5vc3BhY2UsICBzdGF0LT50eF9zdGF0ZSk7CisKKyNkZWZpbmUgSyh4KSBraXNzLT54CisJCXNlcV9wcmludGYoc2VxLCAiXHQlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJCQlLKHR4ZGVsYXkpLCBLKHBlcnNpc3QpLCBLKHNsb3R0aW1lKSwgSyh0YWlsdGltZSksCisJCQkJSyhmdWxsZHVwKSwgSyh3YWl0dGltZSksIEsobWludGltZSksIEsobWF4a2V5dXApLAorCQkJCUsoaWRsZXRpbWUpLCBLKG1heGRlZmVyKSwgSyh0eF9pbmhpYml0KSwgSyhncm91cCkpOworI3VuZGVmIEsKKyNpZmRlZiBTQ0NfREVCVUcKKwkJeworCQkJaW50IHJlZzsKKworCQlzZXFfcHJpbnRmKHNlcSwgIlx0VyAiKTsKKwkJCWZvciAocmVnID0gMDsgcmVnIDwgMTY7IHJlZysrKQorCQkJCXNlcV9wcmludGYoc2VxLCAiJTIuMnggIiwgc2NjLT53cmVnW3JlZ10pOworCQkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCQkJCisJCXNlcV9wcmludGYoc2VxLCAiXHRSICUyLjJ4ICUyLjJ4IFhYICIsIEluUmVnKHNjYy0+Y3RybCxSMCksIEluUmVnKHNjYy0+Y3RybCxSMSkpOworCQkJZm9yIChyZWcgPSAzOyByZWcgPCA4OyByZWcrKykKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiUyLjJ4ICIsIEluUmVnKHNjYy0+Y3RybCwgcmVnKSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlhYICIpOworCQkJZm9yIChyZWcgPSA5OyByZWcgPCAxNjsgcmVnKyspCisJCQkJc2VxX3ByaW50ZihzZXEsICIlMi4yeCAiLCBJblJlZyhzY2MtPmN0cmwsIHJlZykpOworCQkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCQl9CisjZW5kaWYKKwkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKwl9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc2NjX25ldF9zZXFfb3BzID0geworCS5zdGFydCAgPSBzY2NfbmV0X3NlcV9zdGFydCwKKwkubmV4dCAgID0gc2NjX25ldF9zZXFfbmV4dCwKKwkuc3RvcCAgID0gc2NjX25ldF9zZXFfc3RvcCwKKwkuc2hvdyAgID0gc2NjX25ldF9zZXFfc2hvdywKK307CisKKworc3RhdGljIGludCBzY2NfbmV0X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmc2NjX25ldF9zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2NjX25ldF9zZXFfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4JID0gc2NjX25ldF9zZXFfb3BlbiwKKwkucmVhZAkgPSBzZXFfcmVhZCwKKwkubGxzZWVrCSA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworCisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworIAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogCQkJSW5pdCBTQ0MgZHJpdmVyIAkJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgX19pbml0IHNjY19pbml0X2RyaXZlciAodm9pZCkKK3sKKwljaGFyIGRldm5hbWVbSUZOQU1TSVpdOworCQorCXByaW50ayhiYW5uZXIpOworCQorCXNwcmludGYoZGV2bmFtZSwiJXMwIiwgU0NDX0RyaXZlck5hbWUpOworCQorCXJ0bmxfbG9jaygpOworCWlmIChzY2NfbmV0X2FsbG9jKGRldm5hbWUsIFNDQ19JbmZvKSkgeworCQlydG5sX3VubG9jaygpOworCQlwcmludGsoS0VSTl9FUlIgIno4NTMwZHJ2OiBjYW5ub3QgaW5pdGlhbGl6ZSBtb2R1bGVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcnRubF91bmxvY2soKTsKKworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJ6ODUzMGRydiIsIDAsICZzY2NfbmV0X3NlcV9mb3BzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2NjX2NsZWFudXBfZHJpdmVyKHZvaWQpCit7CisJaW9fcG9ydCBjdHJsOworCWludCBrOworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCisJaWYgKE5jaGlwcyA9PSAwICYmIChkZXYgPSBTQ0NfSW5mb1swXS5kZXYpKSAKKwl7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorCisJLyogR3VhcmQgYWdhaW5zdCBjaGlwIHByYXR0bGUgKi8KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQorCWZvciAoayA9IDA7IGsgPCBOY2hpcHM7IGsrKykKKwkJaWYgKCAoY3RybCA9IFNDQ19jdHJsW2tdLmNoYW5fQSkgKQorCQl7CisJCQlPdXRiKGN0cmwsIDApOworCQkJT3V0UmVnKGN0cmwsUjksRkhXUkVTKTsJLyogZm9yY2UgaGFyZHdhcmUgcmVzZXQgKi8KKwkJCXVkZWxheSg1MCk7CisJCX0KKwkJCisJLyogVG8gdW5sb2FkIHRoZSBwb3J0IG11c3QgYmUgY2xvc2VkIHNvIG5vIHJlYWwgSVJRIHBlbmRpbmcgKi8KKwlmb3IgKGs9MDsgayA8IE5SX0lSUVMgOyBrKyspCisJCWlmIChJdmVjW2tdLnVzZWQpIGZyZWVfaXJxKGssIE5VTEwpOworCQkKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCQorCS8qIE5vdyBjbGVhbiB1cCAqLworCWZvciAoayA9IDA7IGsgPCBOY2hpcHMqMjsgaysrKQorCXsKKwkJc2NjID0gJlNDQ19JbmZvW2tdOworCQlpZiAoc2NjLT5jdHJsKQorCQl7CisJCQlyZWxlYXNlX3JlZ2lvbihzY2MtPmN0cmwsIDEpOworCQkJcmVsZWFzZV9yZWdpb24oc2NjLT5kYXRhLCAxKTsKKwkJfQorCQlpZiAoc2NjLT5kZXYpCisJCXsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KHNjYy0+ZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KHNjYy0+ZGV2KTsKKwkJfQorCX0KKwkKKwkJCisJaWYgKFZlY3Rvcl9MYXRjaCkKKwkJcmVsZWFzZV9yZWdpb24oVmVjdG9yX0xhdGNoLCAxKTsKKworCXByb2NfbmV0X3JlbW92ZSgiejg1MzBkcnYiKTsKK30KKworTU9EVUxFX0FVVEhPUigiSm9lcmcgUmV1dGVyIDxqcmV1dGVyQHlhaW5hLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBWC4yNSBEZXZpY2UgRHJpdmVyIGZvciBaODUzMCBiYXNlZCBIRExDIGNhcmRzIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiWjg1MzAgYmFzZWQgU0NDIGNhcmRzIGZvciBBbWF0ZXVyIFJhZGlvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfaW5pdChzY2NfaW5pdF9kcml2ZXIpOworbW9kdWxlX2V4aXQoc2NjX2NsZWFudXBfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbS5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3YjAwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbS5jCkBAIC0wLDAgKzEsMTIxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogICAgeWFtLmMgIC0tIFlBTSByYWRpbyBtb2RlbSBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZGVyaWMgUmlibGUgRjFPQVQgKGZyaWJsZUB0ZWFzZXIuZnIpCisgKiAgICAgIEFkYXB0ZWQgZnJvbSBiYXljb20uYyBkcml2ZXIgd3JpdHRlbiBieSBUaG9tYXMgU2FpbGVyIChzYWlsZXJAaWZlLmVlLmV0aHouY2gpCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBHUEwgYWxsb3dzIHlvdSB0byB1c2UgdGhlIGRyaXZlciwgTk9UIHRoZSByYWRpby4KKyAqICBJbiBvcmRlciB0byB1c2UgdGhlIHJhZGlvLCB5b3UgbmVlZCBhIGxpY2Vuc2UgZnJvbSB0aGUgY29tbXVuaWNhdGlvbnMKKyAqICBhdXRob3JpdHkgb2YgeW91ciBjb3VudHJ5LgorICoKKyAqCisgKiAgSGlzdG9yeToKKyAqICAgMC4wIEYxT0FUIDA2LjA2Ljk4ICBCZWdpbiBvZiB3b3JrIHdpdGggYmF5Y29tLmMgc291cmNlIGNvZGUgViAwLjMKKyAqICAgMC4xIEYxT0FUIDA3LjA2Ljk4ICBBZGQgdGltZXIgcG9sbGluZyByb3V0aW5lIGZvciBjaGFubmVsIGFyYml0cmF0aW9uCisgKiAgIDAuMiBGNkZCQiAwOC4wNi45OCAgQWRkZWQgZGVsYXkgYWZ0ZXIgRlBHQSBwcm9ncmFtbWluZworICogICAwLjMgRjZGQkIgMjkuMDcuOTggIERlbGF5ZWQgUFRUIGltcGxlbWVudGF0aW9uIGZvciBkdXBtb2RlPTIKKyAqICAgMC40IEY2RkJCIDMwLjA3Ljk4ICBBZGRlZCBUeFRhaWwsIFNsb3R0aW1lIGFuZCBQZXJzaXN0YW5jZQorICogICAwLjUgRjZGQkIgMDEuMDguOTggIFNoYXJlZCBJUlFzLCAvcHJvYy9uZXQgYW5kIG5ldHdvcmsgc3RhdGlzdGljcworICogICAwLjYgRjZGQkIgMjUuMDguOTggIEFkZGVkIDEyMDBCZHMgZm9ybWF0CisgKiAgIDAuNyBGNkZCQiAxMi4wOS45OCAgQWRkZWQgdG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uCisgKiAgIDAuOCBGNkZCQiAxNC4xMC45OCAgRml4ZWQgc2xvdHRpbWUvcGVyc2lzdGVuY2UgdGltaW5nIGJ1ZworICogICAgICAgT0sxWklBIDIuMDkuMDEgIEZpeGVkICJrZnJlZV9za2Igb24gaGFyZCBJUlEiIAorICogICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGRldl9rZnJlZV9za2JfYW55KCkuIChpbXBvcnRhbnQgaW4gMi40IGtlcm5lbCkKKyAqICAgCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKy8qIHByb3RvdHlwZXMgZm9yIGF4MjVfZW5jYXBzdWxhdGUgYW5kIGF4MjVfcmVidWlsZF9oZWFkZXIgKi8KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2VuZGlmCS8qIENPTkZJR19BWDI1IHx8IENPTkZJR19BWDI1X01PRFVMRSAqLworCisvKiBtYWtlIGdlbmtzeW1zIGhhcHB5ICovCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC95YW0uaD4KKyNpbmNsdWRlICJ5YW05NjAwLmgiCisjaW5jbHVkZSAieWFtMTIwMC5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgeWFtX2Rydm5hbWVbXSA9ICJ5YW0iOworc3RhdGljIGNoYXIgeWFtX2RydmluZm9bXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJZQU0gZHJpdmVyIHZlcnNpb24gMC44IGJ5IEYxT0FUL0Y2RkJCXG4iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBZQU1fOTYwMAkxCisjZGVmaW5lIFlBTV8xMjAwCTIKKworI2RlZmluZSBOUl9QT1JUUwk0CisjZGVmaW5lIFlBTV9NQUdJQwkweEYxMEE3NjU0CisKKy8qIFRyYW5zbWl0dGVyIHN0YXRlcyAqLworCisjZGVmaW5lIFRYX09GRgkJMAorI2RlZmluZSBUWF9IRUFECQkxCisjZGVmaW5lIFRYX0RBVEEJCTIKKyNkZWZpbmUgVFhfQ1JDMQkJMworI2RlZmluZSBUWF9DUkMyCQk0CisjZGVmaW5lIFRYX1RBSUwJCTUKKworI2RlZmluZSBZQU1fTUFYX0ZSQU1FCTEwMjQKKworI2RlZmluZSBERUZBVUxUX0JJVFJBVEUJOTYwMAkJCS8qIGJwcyAqLworI2RlZmluZSBERUZBVUxUX0hPTERECTEwCQkJLyogc2VjICovCisjZGVmaW5lIERFRkFVTFRfVFhECTMwMAkJCS8qIG1zICovCisjZGVmaW5lIERFRkFVTFRfVFhUQUlMCTEwCQkJLyogbXMgKi8KKyNkZWZpbmUgREVGQVVMVF9TTE9UCTEwMAkJCS8qIG1zICovCisjZGVmaW5lIERFRkFVTFRfUEVSUwk2NAkJCS8qIDAtPjI1NSAqLworCitzdHJ1Y3QgeWFtX3BvcnQgeworCWludCBtYWdpYzsKKwlpbnQgYml0cmF0ZTsKKwlpbnQgYmF1ZHJhdGU7CisJaW50IGlvYmFzZTsKKwlpbnQgaXJxOworCWludCBkdXBtb2RlOworCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCS8qIFN0YXRzIHNlY3Rpb24gKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJaW50IG5iX3J4aW50OworCWludCBuYl9tZGludDsKKworCS8qIFBhcmFtZXRlcnMgc2VjdGlvbiAqLworCisJaW50IHR4ZDsJCQkJLyogdHggZGVsYXkgKi8KKwlpbnQgaG9sZGQ7CQkJCS8qIGR1cGxleCBwdHQgZGVsYXkgKi8KKwlpbnQgdHh0YWlsOwkJCQkvKiB0eHRhaWwgZGVsYXkgKi8KKwlpbnQgc2xvdDsJCQkJLyogc2xvdHRpbWUgKi8KKwlpbnQgcGVyczsJCQkJLyogcGVyc2lzdGVuY2UgKi8KKworCS8qIFR4IHNlY3Rpb24gKi8KKworCWludCB0eF9zdGF0ZTsKKwlpbnQgdHhfY291bnQ7CisJaW50IHNsb3RjbnQ7CisJdW5zaWduZWQgY2hhciB0eF9idWZbWUFNX01BWF9GUkFNRV07CisJaW50IHR4X2xlbjsKKwlpbnQgdHhfY3JjbCwgdHhfY3JjaDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNlbmRfcXVldWU7CQkvKiBQYWNrZXRzIGF3YWl0aW5nIHRyYW5zbWlzc2lvbiAqLworCisJLyogUnggc2VjdGlvbiAqLworCisJaW50IGRjZDsKKwl1bnNpZ25lZCBjaGFyIHJ4X2J1ZltZQU1fTUFYX0ZSQU1FXTsKKwlpbnQgcnhfbGVuOworCWludCByeF9jcmNsLCByeF9jcmNoOworfTsKKworc3RydWN0IHlhbV9tY3MgeworCXVuc2lnbmVkIGNoYXIgYml0c1tZQU1fRlBHQV9TSVpFXTsKKwlpbnQgYml0cmF0ZTsKKwlzdHJ1Y3QgeWFtX21jcyAqbmV4dDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqeWFtX2RldnNbTlJfUE9SVFNdOworCitzdGF0aWMgc3RydWN0IHlhbV9tY3MgKnlhbV9kYXRhOworCitzdGF0aWMgY2hhciBheDI1X2JjYXN0WzddID0KK3snUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnMCcgPDwgMX07CitzdGF0aWMgY2hhciBheDI1X3Rlc3RbN10gPQoreydMJyA8PCAxLCAnSScgPDwgMSwgJ04nIDw8IDEsICdVJyA8PCAxLCAnWCcgPDwgMSwgJyAnIDw8IDEsICcxJyA8PCAxfTsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHlhbV90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSQlIoaW9iYXNlKQkoaW9iYXNlKzApCisjZGVmaW5lIFRIUihpb2Jhc2UpCShpb2Jhc2UrMCkKKyNkZWZpbmUgSUVSKGlvYmFzZSkJKGlvYmFzZSsxKQorI2RlZmluZSBJSVIoaW9iYXNlKQkoaW9iYXNlKzIpCisjZGVmaW5lIEZDUihpb2Jhc2UpCShpb2Jhc2UrMikKKyNkZWZpbmUgTENSKGlvYmFzZSkJKGlvYmFzZSszKQorI2RlZmluZSBNQ1IoaW9iYXNlKQkoaW9iYXNlKzQpCisjZGVmaW5lIExTUihpb2Jhc2UpCShpb2Jhc2UrNSkKKyNkZWZpbmUgTVNSKGlvYmFzZSkJKGlvYmFzZSs2KQorI2RlZmluZSBTQ1IoaW9iYXNlKQkoaW9iYXNlKzcpCisjZGVmaW5lIERMTChpb2Jhc2UpCShpb2Jhc2UrMCkKKyNkZWZpbmUgRExNKGlvYmFzZSkJKGlvYmFzZSsxKQorCisjZGVmaW5lIFlBTV9FWFRFTlQJOAorCisvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgQml0IE1hc2tzICovCisjZGVmaW5lIElJUl9OT1BFTkQJMQorI2RlZmluZSBJSVJfTVNSCQkwCisjZGVmaW5lIElJUl9UWAkJMgorI2RlZmluZSBJSVJfUlgJCTQKKyNkZWZpbmUgSUlSX0xTUgkJNgorI2RlZmluZSBJSVJfVElNRU9VVAkxMgkJCS8qIEZpZm8gbW9kZSBvbmx5ICovCisKKyNkZWZpbmUgSUlSX01BU0sJMHgwRgorCisvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLworI2RlZmluZSBJRVJfUlgJCTEJCQkvKiBlbmFibGUgcnggaW50ZXJydXB0ICovCisjZGVmaW5lIElFUl9UWAkJMgkJCS8qIGVuYWJsZSB0eCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSUVSX0xTUgkJNAkJCS8qIGVuYWJsZSBsaW5lIHN0YXR1cyBpbnRlcnJ1cHRzICovCisjZGVmaW5lIElFUl9NU1IJCTgJCQkvKiBlbmFibGUgbW9kZW0gc3RhdHVzIGludGVycnVwdHMgKi8KKworLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciBCaXQgTWFza3MgKi8KKyNkZWZpbmUgTUNSX0RUUgkJMHgwMQkJCS8qIERUUiBvdXRwdXQgKi8KKyNkZWZpbmUgTUNSX1JUUwkJMHgwMgkJCS8qIFJUUyBvdXRwdXQgKi8KKyNkZWZpbmUgTUNSX09VVDEJMHgwNAkJCS8qIE9VVDEgb3V0cHV0IChub3QgYWNjZXNzaWJsZSBpbiBSUzIzMikgKi8KKyNkZWZpbmUgTUNSX09VVDIJMHgwOAkJCS8qIE1hc3RlciBJbnRlcnJ1cHQgZW5hYmxlIChtdXN0IGJlIHNldCBvbiBQQ3MpICovCisjZGVmaW5lIE1DUl9MT09QCTB4MTAJCQkvKiBMb29wYmFjayBlbmFibGUgKi8KKworLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLworI2RlZmluZSBNU1JfRENUUwkweDAxCQkJLyogRGVsdGEgQ1RTIGlucHV0ICovCisjZGVmaW5lIE1TUl9ERFNSCTB4MDIJCQkvKiBEZWx0YSBEU1IgKi8KKyNkZWZpbmUgTVNSX0RSSU4JMHgwNAkJCS8qIERlbHRhIFJJICovCisjZGVmaW5lIE1TUl9ERENECTB4MDgJCQkvKiBEZWx0YSBEQ0QgKi8KKyNkZWZpbmUgTVNSX0NUUwkJMHgxMAkJCS8qIENUUyBpbnB1dCAqLworI2RlZmluZSBNU1JfRFNSCQkweDIwCQkJLyogRFNSIGlucHV0ICovCisjZGVmaW5lIE1TUl9SSU5HCTB4NDAJCQkvKiBSSSAgaW5wdXQgKi8KKyNkZWZpbmUgTVNSX0RDRAkJMHg4MAkJCS8qIERDRCBpbnB1dCAqLworCisvKiBsaW5lIHN0YXR1cyByZWdpc3RlciBiaXQgbWFzayAqLworI2RlZmluZSBMU1JfUlhDCQkweDAxCisjZGVmaW5lIExTUl9PRQkJMHgwMgorI2RlZmluZSBMU1JfUEUJCTB4MDQKKyNkZWZpbmUgTFNSX0ZFCQkweDA4CisjZGVmaW5lIExTUl9CUkVBSwkweDEwCisjZGVmaW5lIExTUl9USFJFCTB4MjAKKyNkZWZpbmUgTFNSX1RTUkUJMHg0MAorCisvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgQml0IE1hc2tzICovCisjZGVmaW5lIExDUl9ETEFCCTB4ODAKKyNkZWZpbmUgTENSX0JSRUFLCTB4NDAKKyNkZWZpbmUgTENSX1BaRVJPCTB4MjgKKyNkZWZpbmUgTENSX1BFVkVOCTB4MTgKKyNkZWZpbmUgTENSX1BPREQJMHgwOAorI2RlZmluZSBMQ1JfU1RPUDEJMHgwMAorI2RlZmluZSBMQ1JfU1RPUDIJMHgwNAorI2RlZmluZSBMQ1JfQklUNQkweDAwCisjZGVmaW5lIExDUl9CSVQ2CTB4MDIKKyNkZWZpbmUgTENSX0JJVDcJMHgwMQorI2RlZmluZSBMQ1JfQklUOAkweDAzCisKKy8qIFlBTSBNb2RlbSA8LT4gVUFSVCBQb3J0IG1hcHBpbmcgKi8KKworI2RlZmluZSBUWF9SRFkJCU1TUl9EQ1RTCQkvKiB0cmFuc21pdHRlciByZWFkeSB0byBzZW5kICovCisjZGVmaW5lIFJYX0RDRAkJTVNSX0RDRAkJCS8qIGNhcnJpZXIgZGV0ZWN0ICovCisjZGVmaW5lIFJYX0ZMQUcJCU1TUl9SSU5HCQkvKiBoZGxjIGZsYWcgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRlBHQV9ET05FCU1TUl9EU1IJCQkvKiBGUEdBIGlzIGNvbmZpZ3VyZWQgKi8KKyNkZWZpbmUgUFRUX09OCQkoTUNSX1JUU3xNQ1JfT1VUMikJLyogYWN0aXZhdGUgUFRUICovCisjZGVmaW5lIFBUVF9PRkYJCShNQ1JfRFRSfE1DUl9PVVQyKQkvKiByZWxlYXNlIFBUVCAqLworCisjZGVmaW5lIEVOQUJMRV9SWElOVAlJRVJfUlgJCQkvKiBlbmFibGUgdWFydCByeCBpbnRlcnJ1cHQgZHVyaW5nIHJ4ICovCisjZGVmaW5lIEVOQUJMRV9UWElOVAlJRVJfTVNSCQkJLyogZW5hYmxlIHVhcnQgbXMgaW50ZXJydXB0IGR1cmluZyB0eCAqLworI2RlZmluZSBFTkFCTEVfUlRYSU5UCShJRVJfUlh8SUVSX01TUikJLyogZnVsbCBkdXBsZXggb3BlcmF0aW9ucyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENSQyBUYWJsZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2hrdGFibFsyNTZdID0KK3sweDAwLCAweDg5LCAweDEyLCAweDliLCAweDI0LCAweGFkLCAweDM2LCAweGJmLCAweDQ4LCAweGMxLCAweDVhLCAweGQzLCAweDZjLCAweGU1LCAweDdlLAorIDB4ZjcsIDB4ODEsIDB4MDgsIDB4OTMsIDB4MWEsIDB4YTUsIDB4MmMsIDB4YjcsIDB4M2UsIDB4YzksIDB4NDAsIDB4ZGIsIDB4NTIsIDB4ZWQsIDB4NjQsCisgMHhmZiwgMHg3NiwgMHgwMiwgMHg4YiwgMHgxMCwgMHg5OSwgMHgyNiwgMHhhZiwgMHgzNCwgMHhiZCwgMHg0YSwgMHhjMywgMHg1OCwgMHhkMSwgMHg2ZSwKKyAweGU3LCAweDdjLCAweGY1LCAweDgzLCAweDBhLCAweDkxLCAweDE4LCAweGE3LCAweDJlLCAweGI1LCAweDNjLCAweGNiLCAweDQyLCAweGQ5LCAweDUwLAorIDB4ZWYsIDB4NjYsIDB4ZmQsIDB4NzQsIDB4MDQsIDB4OGQsIDB4MTYsIDB4OWYsIDB4MjAsIDB4YTksIDB4MzIsIDB4YmIsIDB4NGMsIDB4YzUsIDB4NWUsCisgMHhkNywgMHg2OCwgMHhlMSwgMHg3YSwgMHhmMywgMHg4NSwgMHgwYywgMHg5NywgMHgxZSwgMHhhMSwgMHgyOCwgMHhiMywgMHgzYSwgMHhjZCwgMHg0NCwKKyAweGRmLCAweDU2LCAweGU5LCAweDYwLCAweGZiLCAweDcyLCAweDA2LCAweDhmLCAweDE0LCAweDlkLCAweDIyLCAweGFiLCAweDMwLCAweGI5LCAweDRlLAorIDB4YzcsIDB4NWMsIDB4ZDUsIDB4NmEsIDB4ZTMsIDB4NzgsIDB4ZjEsIDB4ODcsIDB4MGUsIDB4OTUsIDB4MWMsIDB4YTMsIDB4MmEsIDB4YjEsIDB4MzgsCisgMHhjZiwgMHg0NiwgMHhkZCwgMHg1NCwgMHhlYiwgMHg2MiwgMHhmOSwgMHg3MCwgMHgwOCwgMHg4MSwgMHgxYSwgMHg5MywgMHgyYywgMHhhNSwgMHgzZSwKKyAweGI3LCAweDQwLCAweGM5LCAweDUyLCAweGRiLCAweDY0LCAweGVkLCAweDc2LCAweGZmLCAweDg5LCAweDAwLCAweDliLCAweDEyLCAweGFkLCAweDI0LAorIDB4YmYsIDB4MzYsIDB4YzEsIDB4NDgsIDB4ZDMsIDB4NWEsIDB4ZTUsIDB4NmMsIDB4ZjcsIDB4N2UsIDB4MGEsIDB4ODMsIDB4MTgsIDB4OTEsIDB4MmUsCisgMHhhNywgMHgzYywgMHhiNSwgMHg0MiwgMHhjYiwgMHg1MCwgMHhkOSwgMHg2NiwgMHhlZiwgMHg3NCwgMHhmZCwgMHg4YiwgMHgwMiwgMHg5OSwgMHgxMCwKKyAweGFmLCAweDI2LCAweGJkLCAweDM0LCAweGMzLCAweDRhLCAweGQxLCAweDU4LCAweGU3LCAweDZlLCAweGY1LCAweDdjLCAweDBjLCAweDg1LCAweDFlLAorIDB4OTcsIDB4MjgsIDB4YTEsIDB4M2EsIDB4YjMsIDB4NDQsIDB4Y2QsIDB4NTYsIDB4ZGYsIDB4NjAsIDB4ZTksIDB4NzIsIDB4ZmIsIDB4OGQsIDB4MDQsCisgMHg5ZiwgMHgxNiwgMHhhOSwgMHgyMCwgMHhiYiwgMHgzMiwgMHhjNSwgMHg0YywgMHhkNywgMHg1ZSwgMHhlMSwgMHg2OCwgMHhmMywgMHg3YSwgMHgwZSwKKyAweDg3LCAweDFjLCAweDk1LCAweDJhLCAweGEzLCAweDM4LCAweGIxLCAweDQ2LCAweGNmLCAweDU0LCAweGRkLCAweDYyLCAweGViLCAweDcwLCAweGY5LAorIDB4OGYsIDB4MDYsIDB4OWQsIDB4MTQsIDB4YWIsIDB4MjIsIDB4YjksIDB4MzAsIDB4YzcsIDB4NGUsIDB4ZDUsIDB4NWMsIDB4ZTMsIDB4NmEsIDB4ZjEsCisgMHg3OH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjaGt0YWJoWzI1Nl0gPQorezB4MDAsIDB4MTEsIDB4MjMsIDB4MzIsIDB4NDYsIDB4NTcsIDB4NjUsIDB4NzQsIDB4OGMsIDB4OWQsIDB4YWYsIDB4YmUsIDB4Y2EsIDB4ZGIsIDB4ZTksCisgMHhmOCwgMHgxMCwgMHgwMSwgMHgzMywgMHgyMiwgMHg1NiwgMHg0NywgMHg3NSwgMHg2NCwgMHg5YywgMHg4ZCwgMHhiZiwgMHhhZSwgMHhkYSwgMHhjYiwKKyAweGY5LCAweGU4LCAweDIxLCAweDMwLCAweDAyLCAweDEzLCAweDY3LCAweDc2LCAweDQ0LCAweDU1LCAweGFkLCAweGJjLCAweDhlLCAweDlmLCAweGViLAorIDB4ZmEsIDB4YzgsIDB4ZDksIDB4MzEsIDB4MjAsIDB4MTIsIDB4MDMsIDB4NzcsIDB4NjYsIDB4NTQsIDB4NDUsIDB4YmQsIDB4YWMsIDB4OWUsIDB4OGYsCisgMHhmYiwgMHhlYSwgMHhkOCwgMHhjOSwgMHg0MiwgMHg1MywgMHg2MSwgMHg3MCwgMHgwNCwgMHgxNSwgMHgyNywgMHgzNiwgMHhjZSwgMHhkZiwgMHhlZCwKKyAweGZjLCAweDg4LCAweDk5LCAweGFiLCAweGJhLCAweDUyLCAweDQzLCAweDcxLCAweDYwLCAweDE0LCAweDA1LCAweDM3LCAweDI2LCAweGRlLCAweGNmLAorIDB4ZmQsIDB4ZWMsIDB4OTgsIDB4ODksIDB4YmIsIDB4YWEsIDB4NjMsIDB4NzIsIDB4NDAsIDB4NTEsIDB4MjUsIDB4MzQsIDB4MDYsIDB4MTcsIDB4ZWYsCisgMHhmZSwgMHhjYywgMHhkZCwgMHhhOSwgMHhiOCwgMHg4YSwgMHg5YiwgMHg3MywgMHg2MiwgMHg1MCwgMHg0MSwgMHgzNSwgMHgyNCwgMHgxNiwgMHgwNywKKyAweGZmLCAweGVlLCAweGRjLCAweGNkLCAweGI5LCAweGE4LCAweDlhLCAweDhiLCAweDg0LCAweDk1LCAweGE3LCAweGI2LCAweGMyLCAweGQzLCAweGUxLAorIDB4ZjAsIDB4MDgsIDB4MTksIDB4MmIsIDB4M2EsIDB4NGUsIDB4NWYsIDB4NmQsIDB4N2MsIDB4OTQsIDB4ODUsIDB4YjcsIDB4YTYsIDB4ZDIsIDB4YzMsCisgMHhmMSwgMHhlMCwgMHgxOCwgMHgwOSwgMHgzYiwgMHgyYSwgMHg1ZSwgMHg0ZiwgMHg3ZCwgMHg2YywgMHhhNSwgMHhiNCwgMHg4NiwgMHg5NywgMHhlMywKKyAweGYyLCAweGMwLCAweGQxLCAweDI5LCAweDM4LCAweDBhLCAweDFiLCAweDZmLCAweDdlLCAweDRjLCAweDVkLCAweGI1LCAweGE0LCAweDk2LCAweDg3LAorIDB4ZjMsIDB4ZTIsIDB4ZDAsIDB4YzEsIDB4MzksIDB4MjgsIDB4MWEsIDB4MGIsIDB4N2YsIDB4NmUsIDB4NWMsIDB4NGQsIDB4YzYsIDB4ZDcsIDB4ZTUsCisgMHhmNCwgMHg4MCwgMHg5MSwgMHhhMywgMHhiMiwgMHg0YSwgMHg1YiwgMHg2OSwgMHg3OCwgMHgwYywgMHgxZCwgMHgyZiwgMHgzZSwgMHhkNiwgMHhjNywKKyAweGY1LCAweGU0LCAweDkwLCAweDgxLCAweGIzLCAweGEyLCAweDVhLCAweDRiLCAweDc5LCAweDY4LCAweDFjLCAweDBkLCAweDNmLCAweDJlLCAweGU3LAorIDB4ZjYsIDB4YzQsIDB4ZDUsIDB4YTEsIDB4YjAsIDB4ODIsIDB4OTMsIDB4NmIsIDB4N2EsIDB4NDgsIDB4NTksIDB4MmQsIDB4M2MsIDB4MGUsIDB4MWYsCisgMHhmNywgMHhlNiwgMHhkNCwgMHhjNSwgMHhiMSwgMHhhMCwgMHg5MiwgMHg4MywgMHg3YiwgMHg2YSwgMHg1OCwgMHg0OSwgMHgzZCwgMHgyYywgMHgxZSwKKyAweDBmfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRlBHQSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZGVsYXkoaW50IG1zKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyAoKG1zICogSFopIC8gMTAwMCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCQljcHVfcmVsYXgoKTsKK30KKworLyoKKyAqIHJlc2V0IEZQR0EKKyAqLworCitzdGF0aWMgdm9pZCBmcGdhX3Jlc2V0KGludCBpb2Jhc2UpCit7CisJb3V0YigwLCBJRVIoaW9iYXNlKSk7CisJb3V0YihMQ1JfRExBQiB8IExDUl9CSVQ1LCBMQ1IoaW9iYXNlKSk7CisJb3V0YigxLCBETEwoaW9iYXNlKSk7CisJb3V0YigwLCBETE0oaW9iYXNlKSk7CisKKwlvdXRiKExDUl9CSVQ1LCBMQ1IoaW9iYXNlKSk7CisJaW5iKExTUihpb2Jhc2UpKTsKKwlpbmIoTVNSKGlvYmFzZSkpOworCS8qIHR1cm4gb2ZmIEZQR0Egc3VwcGx5IHZvbHRhZ2UgKi8KKwlvdXRiKE1DUl9PVVQxIHwgTUNSX09VVDIsIE1DUihpb2Jhc2UpKTsKKwlkZWxheSgxMDApOworCS8qIHR1cm4gb24gRlBHQSBzdXBwbHkgdm9sdGFnZSBhZ2FpbiAqLworCW91dGIoTUNSX0RUUiB8IE1DUl9SVFMgfCBNQ1JfT1VUMSB8IE1DUl9PVVQyLCBNQ1IoaW9iYXNlKSk7CisJZGVsYXkoMTAwKTsKK30KKworLyoKKyAqIHNlbmQgb25lIGJ5dGUgdG8gRlBHQQorICovCisKK3N0YXRpYyBpbnQgZnBnYV93cml0ZShpbnQgaW9iYXNlLCB1bnNpZ25lZCBjaGFyIHdyZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJpdDsKKwlpbnQgazsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFogLyAxMDsKKworCWZvciAoayA9IDA7IGsgPCA4OyBrKyspIHsKKwkJYml0ID0gKHdyZCAmIDB4ODApID8gKE1DUl9SVFMgfCBNQ1JfRFRSKSA6IE1DUl9EVFI7CisJCW91dGIoYml0IHwgTUNSX09VVDEgfCBNQ1JfT1VUMiwgTUNSKGlvYmFzZSkpOworCQl3cmQgPDw9IDE7CisJCW91dGIoMHhmYywgVEhSKGlvYmFzZSkpOworCQl3aGlsZSAoKGluYihMU1IoaW9iYXNlKSkgJiBMU1JfVFNSRSkgPT0gMCkKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmFkZF9tY3ModW5zaWduZWQgY2hhciAqYml0cywgaW50IGJpdHJhdGUpCit7CisJc3RydWN0IHlhbV9tY3MgKnA7CisKKwkvKiBJZiBpdCBhbHJlYWR5IGV4aXN0cywgcmVwbGFjZSB0aGUgYml0IGRhdGEgKi8KKwlwID0geWFtX2RhdGE7CisJd2hpbGUgKHApIHsKKwkJaWYgKHAtPmJpdHJhdGUgPT0gYml0cmF0ZSkgeworCQkJbWVtY3B5KHAtPmJpdHMsIGJpdHMsIFlBTV9GUEdBX1NJWkUpOworCQkJcmV0dXJuIHAtPmJpdHM7CisJCX0KKwkJcCA9IHAtPm5leHQ7CisJfQorCisJLyogQWxsb2NhdGUgYSBuZXcgbWNzICovCisJaWYgKChwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHlhbV9tY3MpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJZQU06IG5vIG1lbW9yeSB0byBhbGxvY2F0ZSBtY3NcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtY3B5KHAtPmJpdHMsIGJpdHMsIFlBTV9GUEdBX1NJWkUpOworCXAtPmJpdHJhdGUgPSBiaXRyYXRlOworCXAtPm5leHQgPSB5YW1fZGF0YTsKKwl5YW1fZGF0YSA9IHA7CisKKwlyZXR1cm4gcC0+Yml0czsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmdldF9tY3MoaW50IGJpdHJhdGUpCit7CisJc3RydWN0IHlhbV9tY3MgKnA7CisKKwlwID0geWFtX2RhdGE7CisJd2hpbGUgKHApIHsKKwkJaWYgKHAtPmJpdHJhdGUgPT0gYml0cmF0ZSkKKwkJCXJldHVybiBwLT5iaXRzOworCQlwID0gcC0+bmV4dDsKKwl9CisKKwkvKiBMb2FkIHByZWRlZmluZWQgbWNzIGRhdGEgKi8KKwlzd2l0Y2ggKGJpdHJhdGUpIHsKKwljYXNlIDEyMDA6CisJCXJldHVybiBhZGRfbWNzKGJpdHNfMTIwMCwgYml0cmF0ZSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGFkZF9tY3MoYml0c185NjAwLCBiaXRyYXRlKTsKKwl9Cit9CisKKy8qCisgKiBkb3dubG9hZCBiaXRzdHJlYW0gdG8gRlBHQQorICogZGF0YSBpcyBjb250YWluZWQgaW4gYml0c1tdIGFycmF5IGluIHlhbTEyMDAuaCByZXNwLiB5YW05NjAwLmgKKyAqLworCitzdGF0aWMgaW50IGZwZ2FfZG93bmxvYWQoaW50IGlvYmFzZSwgaW50IGJpdHJhdGUpCit7CisJaW50IGksIHJjOworCXVuc2lnbmVkIGNoYXIgKnBiaXRzOworCisJcGJpdHMgPSBnZXRfbWNzKGJpdHJhdGUpOworCWlmIChwYml0cyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlmcGdhX3Jlc2V0KGlvYmFzZSk7CisJZm9yIChpID0gMDsgaSA8IFlBTV9GUEdBX1NJWkU7IGkrKykgeworCQlpZiAoZnBnYV93cml0ZShpb2Jhc2UsIHBiaXRzW2ldKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ5YW06IGVycm9yIGluIHdyaXRlIGN5Y2xlXG4iKTsKKwkJCXJldHVybiAtMTsJCQkvKiB3cml0ZS4uLiAqLworCQl9CisJfQorCisJZnBnYV93cml0ZShpb2Jhc2UsIDB4RkYpOworCXJjID0gaW5iKE1TUihpb2Jhc2UpKTsJCS8qIGNoZWNrIERPTkUgc2lnbmFsICovCisKKwkvKiBOZWVkZWQgZm9yIHNvbWUgaGFyZHdhcmVzICovCisJZGVsYXkoNTApOworCisJcmV0dXJuIChyYyAmIE1TUl9EU1IpID8gMCA6IC0xOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2VyaWFsIHBvcnQgaW5pdCAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgeWFtX3NldF91YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHlhbV9wb3J0ICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGRpdmlzb3IgPSAxMTUyMDAgLyB5cC0+YmF1ZHJhdGU7CisKKwlvdXRiKDAsIElFUihkZXYtPmJhc2VfYWRkcikpOworCW91dGIoTENSX0RMQUIgfCBMQ1JfQklUOCwgTENSKGRldi0+YmFzZV9hZGRyKSk7CisJb3V0YihkaXZpc29yLCBETEwoZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKDAsIERMTShkZXYtPmJhc2VfYWRkcikpOworCW91dGIoTENSX0JJVDgsIExDUihkZXYtPmJhc2VfYWRkcikpOworCW91dGIoUFRUX09GRiwgTUNSKGRldi0+YmFzZV9hZGRyKSk7CisJb3V0YigweDAwLCBGQ1IoZGV2LT5iYXNlX2FkZHIpKTsKKworCS8qIEZsdXNoIHBlbmRpbmcgaXJxICovCisKKwlpbmIoUkJSKGRldi0+YmFzZV9hZGRyKSk7CisJaW5iKE1TUihkZXYtPmJhc2VfYWRkcikpOworCisJLyogRW5hYmxlIHJ4IGlycSAqLworCisJb3V0YihFTkFCTEVfUlRYSU5ULCBJRVIoZGV2LT5iYXNlX2FkZHIpKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSB1YXJ0IHsKKwljX3VhcnRfdW5rbm93biwgY191YXJ0XzgyNTAsCisJY191YXJ0XzE2NDUwLCBjX3VhcnRfMTY1NTAsIGNfdWFydF8xNjU1MEEKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICp1YXJ0X3N0cltdID0KK3sidW5rbm93biIsICI4MjUwIiwgIjE2NDUwIiwgIjE2NTUwIiwgIjE2NTUwQSJ9OworCitzdGF0aWMgZW51bSB1YXJ0IHlhbV9jaGVja191YXJ0KHVuc2lnbmVkIGludCBpb2Jhc2UpCit7CisJdW5zaWduZWQgY2hhciBiMSwgYjIsIGIzOworCWVudW0gdWFydCB1OworCWVudW0gdWFydCB1YXJ0X3RhYltdID0KKwl7Y191YXJ0XzE2NDUwLCBjX3VhcnRfdW5rbm93biwgY191YXJ0XzE2NTUwLCBjX3VhcnRfMTY1NTBBfTsKKworCWIxID0gaW5iKE1DUihpb2Jhc2UpKTsKKwlvdXRiKGIxIHwgMHgxMCwgTUNSKGlvYmFzZSkpOwkvKiBsb29wYmFjayBtb2RlICovCisJYjIgPSBpbmIoTVNSKGlvYmFzZSkpOworCW91dGIoMHgxYSwgTUNSKGlvYmFzZSkpOworCWIzID0gaW5iKE1TUihpb2Jhc2UpKSAmIDB4ZjA7CisJb3V0YihiMSwgTUNSKGlvYmFzZSkpOwkJLyogcmVzdG9yZSBvbGQgdmFsdWVzICovCisJb3V0YihiMiwgTVNSKGlvYmFzZSkpOworCWlmIChiMyAhPSAweDkwKQorCQlyZXR1cm4gY191YXJ0X3Vua25vd247CisJaW5iKFJCUihpb2Jhc2UpKTsKKwlpbmIoUkJSKGlvYmFzZSkpOworCW91dGIoMHgwMSwgRkNSKGlvYmFzZSkpOwkvKiBlbmFibGUgRklGT3MgKi8KKwl1ID0gdWFydF90YWJbKGluYihJSVIoaW9iYXNlKSkgPj4gNikgJiAzXTsKKwlpZiAodSA9PSBjX3VhcnRfMTY0NTApIHsKKwkJb3V0YigweDVhLCBTQ1IoaW9iYXNlKSk7CisJCWIxID0gaW5iKFNDUihpb2Jhc2UpKTsKKwkJb3V0YigweGE1LCBTQ1IoaW9iYXNlKSk7CisJCWIyID0gaW5iKFNDUihpb2Jhc2UpKTsKKwkJaWYgKChiMSAhPSAweDVhKSB8fCAoYjIgIT0gMHhhNSkpCisJCQl1ID0gY191YXJ0XzgyNTA7CisJfQorCXJldHVybiB1OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJ4IFNlY3Rpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB5YW1fcnhfZmxhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgeWFtX3BvcnQgKnlwKQoreworCWlmICh5cC0+ZGNkICYmIHlwLT5yeF9sZW4gPj0gMyAmJiB5cC0+cnhfbGVuIDwgWUFNX01BWF9GUkFNRSkgeworCQlpbnQgcGt0X2xlbiA9IHlwLT5yeF9sZW4gLSAyICsgMTsJLyogLUNSQyArIGtpc3MgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlpZiAoKHlwLT5yeF9jcmNoICYgeXAtPnJ4X2NyY2wpICE9IDB4RkYpIHsKKwkJCS8qIEJhZCBjcmMgKi8KKwkJfSBlbHNlIHsKKwkJCWlmICghKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbikpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXRcbiIsIGRldi0+bmFtZSk7CisJCQkJKyt5cC0+c3RhdHMucnhfZHJvcHBlZDsKKwkJCX0gZWxzZSB7CisJCQkJdW5zaWduZWQgY2hhciAqY3A7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJY3AgPSBza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQkJKmNwKysgPSAwOwkJLyogS0lTUyBrbHVkZ2UgKi8KKwkJCQltZW1jcHkoY3AsIHlwLT5yeF9idWYsIHBrdF9sZW4gLSAxKTsKKwkJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVgyNSk7CisJCQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQkrK3lwLT5zdGF0cy5yeF9wYWNrZXRzOworCQkJfQorCQl9CisJfQorCXlwLT5yeF9sZW4gPSAwOworCXlwLT5yeF9jcmNsID0gMHgyMTsKKwl5cC0+cnhfY3JjaCA9IDB4ZjM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB5YW1fcnhfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgeWFtX3BvcnQgKnlwLCB1bnNpZ25lZCBjaGFyIHJ4YikKK3sKKwlpZiAoeXAtPnJ4X2xlbiA8IFlBTV9NQVhfRlJBTUUpIHsKKwkJdW5zaWduZWQgY2hhciBjID0geXAtPnJ4X2NyY2w7CisJCXlwLT5yeF9jcmNsID0gKGNoa3RhYmxbY10gXiB5cC0+cnhfY3JjaCk7CisJCXlwLT5yeF9jcmNoID0gKGNoa3RhYmhbY10gXiByeGIpOworCQl5cC0+cnhfYnVmW3lwLT5yeF9sZW4rK10gPSByeGI7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVFggU2VjdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHB0dF9vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW91dGIoUFRUX09OLCBNQ1IoZGV2LT5iYXNlX2FkZHIpKTsKK30KKworc3RhdGljIHZvaWQgcHR0X29mZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW91dGIoUFRUX09GRiwgTUNSKGRldi0+YmFzZV9hZGRyKSk7Cit9CisKK3N0YXRpYyBpbnQgeWFtX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHlhbV9wb3J0ICp5cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlza2JfcXVldWVfdGFpbCgmeXAtPnNlbmRfcXVldWUsIHNrYik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHlhbV9zdGFydF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgeWFtX3BvcnQgKnlwKQoreworCWlmICgoeXAtPnR4X3N0YXRlID09IFRYX1RBSUwpIHx8ICh5cC0+dHhkID09IDApKQorCQl5cC0+dHhfY291bnQgPSAxOworCWVsc2UKKwkJeXAtPnR4X2NvdW50ID0gKHlwLT5iaXRyYXRlICogeXAtPnR4ZCkgLyA4MDAwOworCXlwLT50eF9zdGF0ZSA9IFRYX0hFQUQ7CisJcHR0X29uKGRldik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByYW5kb21fc2VlZDsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCByYW5kb21fbnVtKHZvaWQpCit7CisJcmFuZG9tX3NlZWQgPSAyODYyOSAqIHJhbmRvbV9zZWVkICsgMTU3OworCXJldHVybiByYW5kb21fc2VlZDsKK30KKworc3RhdGljIHZvaWQgeWFtX2FyYml0cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB5YW1fcG9ydCAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHlwLT5tYWdpYyAhPSBZQU1fTUFHSUMgfHwgeXAtPnR4X3N0YXRlICE9IFRYX09GRiB8fAorCSAgICBza2JfcXVldWVfZW1wdHkoJnlwLT5zZW5kX3F1ZXVlKSkKKwkJcmV0dXJuOworCS8qIHR4X3N0YXRlIGlzIFRYX09GRiBhbmQgdGhlcmUgaXMgZGF0YSB0byBzZW5kICovCisKKwlpZiAoeXAtPmR1cG1vZGUpIHsKKwkJLyogRnVsbCBkdXBsZXggbW9kZSwgZG9uJ3Qgd2FpdCAqLworCQl5YW1fc3RhcnRfdHgoZGV2LCB5cCk7CisJCXJldHVybjsKKwl9CisJaWYgKHlwLT5kY2QpIHsKKwkJLyogRENEIG9uLCB3YWl0IHNsb3RpbWUgLi4uICovCisJCXlwLT5zbG90Y250ID0geXAtPnNsb3QgLyAxMDsKKwkJcmV0dXJuOworCX0KKwkvKiBJcyBzbG90dGltZSBwYXNzZWQgPyAqLworCWlmICgoLS15cC0+c2xvdGNudCkgPiAwKQorCQlyZXR1cm47CisKKwl5cC0+c2xvdGNudCA9IHlwLT5zbG90IC8gMTA7CisKKwkvKiBpcyByYW5kb20gPiBwZXJzaXN0ID8gKi8KKwlpZiAoKHJhbmRvbV9udW0oKSAlIDI1NikgPiB5cC0+cGVycykKKwkJcmV0dXJuOworCisJeWFtX3N0YXJ0X3R4KGRldiwgeXApOworfQorCitzdGF0aWMgdm9pZCB5YW1fZG90aW1lcih1bnNpZ25lZCBsb25nIGR1bW15KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHlhbV9kZXZzW2ldOworCQlpZiAoZGV2ICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXlhbV9hcmJpdHJhdGUoZGV2KTsKKwl9CisJeWFtX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDA7CisJYWRkX3RpbWVyKCZ5YW1fdGltZXIpOworfQorCitzdGF0aWMgdm9pZCB5YW1fdHhfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgeWFtX3BvcnQgKnlwKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciBiLCB0ZW1wOworCisJc3dpdGNoICh5cC0+dHhfc3RhdGUpIHsKKwljYXNlIFRYX09GRjoKKwkJYnJlYWs7CisJY2FzZSBUWF9IRUFEOgorCQlpZiAoLS15cC0+dHhfY291bnQgPD0gMCkgeworCQkJaWYgKCEoc2tiID0gc2tiX2RlcXVldWUoJnlwLT5zZW5kX3F1ZXVlKSkpIHsKKwkJCQlwdHRfb2ZmKGRldik7CisJCQkJeXAtPnR4X3N0YXRlID0gVFhfT0ZGOworCQkJCWJyZWFrOworCQkJfQorCQkJeXAtPnR4X3N0YXRlID0gVFhfREFUQTsKKwkJCWlmIChza2ItPmRhdGFbMF0gIT0gMCkgeworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19raXNzX3BhcmFtcyhzLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsgKi8KKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCWJyZWFrOworCQkJfQorCQkJeXAtPnR4X2xlbiA9IHNrYi0+bGVuIC0gMTsJLyogc3RyaXAgS0lTUyBieXRlICovCisJCQlpZiAoeXAtPnR4X2xlbiA+PSBZQU1fTUFYX0ZSQU1FIHx8IHlwLT50eF9sZW4gPCAyKSB7CisgICAgICAgIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1jcHkoeXAtPnR4X2J1Ziwgc2tiLT5kYXRhICsgMSwgeXAtPnR4X2xlbik7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJeXAtPnR4X2NvdW50ID0gMDsKKwkJCXlwLT50eF9jcmNsID0gMHgyMTsKKwkJCXlwLT50eF9jcmNoID0gMHhmMzsKKwkJCXlwLT50eF9zdGF0ZSA9IFRYX0RBVEE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUWF9EQVRBOgorCQliID0geXAtPnR4X2J1Zlt5cC0+dHhfY291bnQrK107CisJCW91dGIoYiwgVEhSKGRldi0+YmFzZV9hZGRyKSk7CisJCXRlbXAgPSB5cC0+dHhfY3JjbDsKKwkJeXAtPnR4X2NyY2wgPSBjaGt0YWJsW3RlbXBdIF4geXAtPnR4X2NyY2g7CisJCXlwLT50eF9jcmNoID0gY2hrdGFiaFt0ZW1wXSBeIGI7CisJCWlmICh5cC0+dHhfY291bnQgPj0geXAtPnR4X2xlbikgeworCQkJeXAtPnR4X3N0YXRlID0gVFhfQ1JDMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFRYX0NSQzE6CisJCXlwLT50eF9jcmNoID0gY2hrdGFibFt5cC0+dHhfY3JjbF0gXiB5cC0+dHhfY3JjaDsKKwkJeXAtPnR4X2NyY2wgPSBjaGt0YWJoW3lwLT50eF9jcmNsXSBeIGNoa3RhYmxbeXAtPnR4X2NyY2hdIF4gMHhmZjsKKwkJb3V0Yih5cC0+dHhfY3JjbCwgVEhSKGRldi0+YmFzZV9hZGRyKSk7CisJCXlwLT50eF9zdGF0ZSA9IFRYX0NSQzI7CisJCWJyZWFrOworCWNhc2UgVFhfQ1JDMjoKKwkJb3V0YihjaGt0YWJoW3lwLT50eF9jcmNoXSBeIDB4RkYsIFRIUihkZXYtPmJhc2VfYWRkcikpOworCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ5cC0+c2VuZF9xdWV1ZSkpIHsKKwkJCXlwLT50eF9jb3VudCA9ICh5cC0+Yml0cmF0ZSAqIHlwLT50eHRhaWwpIC8gODAwMDsKKwkJCWlmICh5cC0+ZHVwbW9kZSA9PSAyKQorCQkJCXlwLT50eF9jb3VudCArPSAoeXAtPmJpdHJhdGUgKiB5cC0+aG9sZGQpIC8gODsKKwkJCWlmICh5cC0+dHhfY291bnQgPT0gMCkKKwkJCQl5cC0+dHhfY291bnQgPSAxOworCQkJeXAtPnR4X3N0YXRlID0gVFhfVEFJTDsKKwkJfSBlbHNlIHsKKwkJCXlwLT50eF9jb3VudCA9IDE7CisJCQl5cC0+dHhfc3RhdGUgPSBUWF9IRUFEOworCQl9CisJCSsreXAtPnN0YXRzLnR4X3BhY2tldHM7CisJCWJyZWFrOworCWNhc2UgVFhfVEFJTDoKKwkJaWYgKC0teXAtPnR4X2NvdW50IDw9IDApIHsKKwkJCXlwLT50eF9zdGF0ZSA9IFRYX09GRjsKKwkJCXB0dF9vZmYoZGV2KTsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJU1Igcm91dGluZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgeWFtX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHlhbV9wb3J0ICp5cDsKKwl1bnNpZ25lZCBjaGFyIGlpcjsKKwlpbnQgY291bnRlciA9IDEwMDsKKwlpbnQgaTsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgeworCQlkZXYgPSB5YW1fZGV2c1tpXTsKKwkJeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKChpaXIgPSBJSVJfTUFTSyAmIGluYihJSVIoZGV2LT5iYXNlX2FkZHIpKSkgIT0gSUlSX05PUEVORCkgeworCQkJdW5zaWduZWQgY2hhciBtc3IgPSBpbmIoTVNSKGRldi0+YmFzZV9hZGRyKSk7CisJCQl1bnNpZ25lZCBjaGFyIGxzciA9IGluYihMU1IoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCXVuc2lnbmVkIGNoYXIgcnhiOworCisJCQloYW5kbGVkID0gMTsKKworCQkJaWYgKGxzciAmIExTUl9PRSkKKwkJCQkrK3lwLT5zdGF0cy5yeF9maWZvX2Vycm9yczsKKworCQkJeXAtPmRjZCA9IChtc3IgJiBSWF9EQ0QpID8gMSA6IDA7CisKKwkJCWlmICgtLWNvdW50ZXIgPD0gMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRvbyBtYW55IGlycSBpaXI9JWRcbiIsCisJCQkJCQlkZXYtPm5hbWUsIGlpcik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAobXNyICYgVFhfUkRZKSB7CisJCQkJKyt5cC0+bmJfbWRpbnQ7CisJCQkJeWFtX3R4X2J5dGUoZGV2LCB5cCk7CisJCQl9CisJCQlpZiAobHNyICYgTFNSX1JYQykgeworCQkJCSsreXAtPm5iX3J4aW50OworCQkJCXJ4YiA9IGluYihSQlIoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCQlpZiAobXNyICYgUlhfRkxBRykKKwkJCQkJeWFtX3J4X2ZsYWcoZGV2LCB5cCk7CisJCQkJZWxzZQorCQkJCQl5YW1fcnhfYnl0ZShkZXYsIHlwLCByeGIpOworCQkJfQorCQl9CisJfQorb3V0OgorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIHZvaWQgKnlhbV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXJldHVybiAoKnBvcyA8IE5SX1BPUlRTKSA/IHlhbV9kZXZzWypwb3NdIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnlhbV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiAoKnBvcyA8IE5SX1BPUlRTKSA/IHlhbV9kZXZzWypwb3NdIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgeWFtX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworfQorCitzdGF0aWMgaW50IHlhbV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdjsKKwljb25zdCBzdHJ1Y3QgeWFtX3BvcnQgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNlcV9wcmludGYoc2VxLCAiRGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCXNlcV9wcmludGYoc2VxLCAiICBVcCAgICAgICAlZFxuIiwgbmV0aWZfcnVubmluZyhkZXYpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgU3BlZWQgICAgJXVcbiIsIHlwLT5iaXRyYXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgSW9CYXNlICAgMHgleFxuIiwgeXAtPmlvYmFzZSk7CisJc2VxX3ByaW50ZihzZXEsICIgIEJhdWRSYXRlICV1XG4iLCB5cC0+YmF1ZHJhdGUpOworCXNlcV9wcmludGYoc2VxLCAiICBJUlEgICAgICAldVxuIiwgeXAtPmlycSk7CisJc2VxX3ByaW50ZihzZXEsICIgIFR4U3RhdGUgICV1XG4iLCB5cC0+dHhfc3RhdGUpOworCXNlcV9wcmludGYoc2VxLCAiICBEdXBsZXggICAldVxuIiwgeXAtPmR1cG1vZGUpOworCXNlcV9wcmludGYoc2VxLCAiICBIb2xkRGx5ICAldVxuIiwgeXAtPmhvbGRkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgVHhEZWxheSAgJXVcbiIsIHlwLT50eGQpOworCXNlcV9wcmludGYoc2VxLCAiICBUeFRhaWwgICAldVxuIiwgeXAtPnR4dGFpbCk7CisJc2VxX3ByaW50ZihzZXEsICIgIFNsb3RUaW1lICV1XG4iLCB5cC0+c2xvdCk7CisJc2VxX3ByaW50ZihzZXEsICIgIFBlcnNpc3QgICV1XG4iLCB5cC0+cGVycyk7CisJc2VxX3ByaW50ZihzZXEsICIgIFR4RnJhbWVzICVsdVxuIiwgeXAtPnN0YXRzLnR4X3BhY2tldHMpOworCXNlcV9wcmludGYoc2VxLCAiICBSeEZyYW1lcyAlbHVcbiIsIHlwLT5zdGF0cy5yeF9wYWNrZXRzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgVHhJbnQgICAgJXVcbiIsIHlwLT5uYl9tZGludCk7CisJc2VxX3ByaW50ZihzZXEsICIgIFJ4SW50ICAgICV1XG4iLCB5cC0+bmJfcnhpbnQpOworCXNlcV9wcmludGYoc2VxLCAiICBSeE92ZXIgICAlbHVcbiIsIHlwLT5zdGF0cy5yeF9maWZvX2Vycm9ycyk7CisJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHlhbV9zZXFvcHMgPSB7CisJLnN0YXJ0ID0geWFtX3NlcV9zdGFydCwKKwkubmV4dCA9IHlhbV9zZXFfbmV4dCwKKwkuc3RvcCA9IHlhbV9zZXFfc3RvcCwKKwkuc2hvdyA9IHlhbV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgeWFtX2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnlhbV9zZXFvcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB5YW1faW5mb19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0geWFtX2luZm9fb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnlhbV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWFtX3BvcnQgKnlwOworCisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWlmICh5cC0+bWFnaWMgIT0gWUFNX01BR0lDKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIAorCSAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLiAgVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlCisJICogY2FyZCBvcGVuIG9yIGNsb3NlZC4gCisJICovCisJcmV0dXJuICZ5cC0+c3RhdHM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHlhbV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHlhbV9wb3J0ICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJZW51bSB1YXJ0IHU7CisJaW50IGk7CisJaW50IHJldD0wOworCisJcHJpbnRrKEtFUk5fSU5GTyAiVHJ5aW5nICVzIGF0IGlvYmFzZSAweCVseCBpcnEgJXVcbiIsIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKworCWlmICghZGV2IHx8ICF5cC0+Yml0cmF0ZSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWRldi0+YmFzZV9hZGRyIHx8IGRldi0+YmFzZV9hZGRyID4gMHgxMDAwIC0gWUFNX0VYVEVOVCB8fAorCQlkZXYtPmlycSA8IDIgfHwgZGV2LT5pcnEgPiAxNSkgeworCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBZQU1fRVhURU5ULCBkZXYtPm5hbWUpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IDB4JWx4IGJ1c3lcbiIsIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisJaWYgKCh1ID0geWFtX2NoZWNrX3VhcnQoZGV2LT5iYXNlX2FkZHIpKSA9PSBjX3VhcnRfdW5rbm93bikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgZmluZCB1YXJ0IHR5cGVcbiIsIGRldi0+bmFtZSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0X3JlbGVhc2VfYmFzZTsKKwl9CisJaWYgKGZwZ2FfZG93bmxvYWQoZGV2LT5iYXNlX2FkZHIsIHlwLT5iaXRyYXRlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgaW5pdCBGUEdBXG4iLCBkZXYtPm5hbWUpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9yZWxlYXNlX2Jhc2U7CisJfQorCW91dGIoMCwgSUVSKGRldi0+YmFzZV9hZGRyKSk7CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCB5YW1faW50ZXJydXB0LCBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlycSAlZCBidXN5XG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dF9yZWxlYXNlX2Jhc2U7CisJfQorCisJeWFtX3NldF91YXJ0KGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCXlwLT5zbG90Y250ID0geXAtPnNsb3QgLyAxMDsKKworCS8qIFJlc2V0IG92ZXJydW5zIGZvciBhbGwgcG9ydHMgLSBGUEdBIHByb2dyYW1taW5nIG1ha2VzIG92ZXJydW5zICovCisJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHlhbV9kZXZzW2ldOworCQlzdHJ1Y3QgeWFtX3BvcnQgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJaW5iKExTUihkZXYtPmJhc2VfYWRkcikpOworCQl5cC0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSAwOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzIGF0IGlvYmFzZSAweCVseCBpcnEgJXUgdWFydCAlc1xuIiwgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsCisJCSAgIHVhcnRfc3RyW3VdKTsKKwlyZXR1cm4gMDsKKworb3V0X3JlbGVhc2VfYmFzZToKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgWUFNX0VYVEVOVCk7CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgeWFtX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgeWFtX3BvcnQgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogZGlzYWJsZSBpbnRlcnJ1cHRzCisJICovCisJb3V0YigwLCBJRVIoZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKDEsIE1DUihkZXYtPmJhc2VfYWRkcikpOworCS8qIFJlbW92ZSBJUlEgaGFuZGxlciBpZiBsYXN0ICovCisJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgWUFNX0VYVEVOVCk7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnlwLT5zZW5kX3F1ZXVlKSkpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBjbG9zZSB5YW0gYXQgaW9iYXNlIDB4JWx4IGlycSAldVxuIiwKKwkJICAgeWFtX2Rydm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHlhbV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgeWFtX3BvcnQgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgeWFtZHJ2X2lvY3RsX2NmZyB5aTsKKwlzdHJ1Y3QgeWFtZHJ2X2lvY3RsX21jcyAqeW07CisJaW50IGlvY3RsX2NtZDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaW9jdGxfY21kLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoaW50KSkpCisJCSByZXR1cm4gLUVGQVVMVDsKKworCWlmICh5cC0+bWFnaWMgIT0gWUFNX01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChjbWQgIT0gU0lPQ0RFVlBSSVZBVEUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChpb2N0bF9jbWQpIHsKKworCWNhc2UgU0lPQ1lBTVJFU0VSVkVEOgorCQlyZXR1cm4gLUVJTlZBTDsJCQkvKiB1bnVzZWQgKi8KKworCWNhc2UgU0lPQ1lBTVNNQ1M6CisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCQlyZXR1cm4gLUVJTlZBTDsJCS8qIENhbm5vdCBjaGFuZ2UgdGhpcyBwYXJhbWV0ZXIgd2hlbiB1cCAqLworCQlpZiAoKHltID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHlhbWRydl9pb2N0bF9tY3MpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJeW0tPmJpdHJhdGUgPSA5NjAwOworCQlpZiAoY29weV9mcm9tX3VzZXIoeW0sIGlmci0+aWZyX2RhdGEsIHNpemVvZihzdHJ1Y3QgeWFtZHJ2X2lvY3RsX21jcykpKSB7CisJCQlrZnJlZSh5bSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoeW0tPmJpdHJhdGUgPiBZQU1fTUFYQklUUkFURSkgeworCQkJa2ZyZWUoeW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYWRkX21jcyh5bS0+Yml0cywgeW0tPmJpdHJhdGUpOworCQlrZnJlZSh5bSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DWUFNU0NGRzoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ5aSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKHN0cnVjdCB5YW1kcnZfaW9jdGxfY2ZnKSkpCisJCQkgcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKCh5aS5jZmcubWFzayAmIFlBTV9JT0JBU0UpICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXJldHVybiAtRUlOVkFMOwkJLyogQ2Fubm90IGNoYW5nZSB0aGlzIHBhcmFtZXRlciB3aGVuIHVwICovCisJCWlmICgoeWkuY2ZnLm1hc2sgJiBZQU1fSVJRKSAmJiBuZXRpZl9ydW5uaW5nKGRldikpCisJCQlyZXR1cm4gLUVJTlZBTDsJCS8qIENhbm5vdCBjaGFuZ2UgdGhpcyBwYXJhbWV0ZXIgd2hlbiB1cCAqLworCQlpZiAoKHlpLmNmZy5tYXNrICYgWUFNX0JJVFJBVEUpICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXJldHVybiAtRUlOVkFMOwkJLyogQ2Fubm90IGNoYW5nZSB0aGlzIHBhcmFtZXRlciB3aGVuIHVwICovCisJCWlmICgoeWkuY2ZnLm1hc2sgJiBZQU1fQkFVRFJBVEUpICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXJldHVybiAtRUlOVkFMOwkJLyogQ2Fubm90IGNoYW5nZSB0aGlzIHBhcmFtZXRlciB3aGVuIHVwICovCisKKwkJaWYgKHlpLmNmZy5tYXNrICYgWUFNX0lPQkFTRSkgeworCQkJeXAtPmlvYmFzZSA9IHlpLmNmZy5pb2Jhc2U7CisJCQlkZXYtPmJhc2VfYWRkciA9IHlpLmNmZy5pb2Jhc2U7CisJCX0KKwkJaWYgKHlpLmNmZy5tYXNrICYgWUFNX0lSUSkgeworCQkJaWYgKHlpLmNmZy5pcnEgPiAxNSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT5pcnEgPSB5aS5jZmcuaXJxOworCQkJZGV2LT5pcnEgPSB5aS5jZmcuaXJxOworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9CSVRSQVRFKSB7CisJCQlpZiAoeWkuY2ZnLmJpdHJhdGUgPiBZQU1fTUFYQklUUkFURSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT5iaXRyYXRlID0geWkuY2ZnLmJpdHJhdGU7CisJCX0KKwkJaWYgKHlpLmNmZy5tYXNrICYgWUFNX0JBVURSQVRFKSB7CisJCQlpZiAoeWkuY2ZnLmJhdWRyYXRlID4gWUFNX01BWEJBVURSQVRFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJeXAtPmJhdWRyYXRlID0geWkuY2ZnLmJhdWRyYXRlOworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9NT0RFKSB7CisJCQlpZiAoeWkuY2ZnLm1vZGUgPiBZQU1fTUFYTU9ERSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT5kdXBtb2RlID0geWkuY2ZnLm1vZGU7CisJCX0KKwkJaWYgKHlpLmNmZy5tYXNrICYgWUFNX0hPTERETFkpIHsKKwkJCWlmICh5aS5jZmcuaG9sZGRseSA+IFlBTV9NQVhIT0xERExZKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJeXAtPmhvbGRkID0geWkuY2ZnLmhvbGRkbHk7CisJCX0KKwkJaWYgKHlpLmNmZy5tYXNrICYgWUFNX1RYREVMQVkpIHsKKwkJCWlmICh5aS5jZmcudHhkZWxheSA+IFlBTV9NQVhUWERFTEFZKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJeXAtPnR4ZCA9IHlpLmNmZy50eGRlbGF5OworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9UWFRBSUwpIHsKKwkJCWlmICh5aS5jZmcudHh0YWlsID4gWUFNX01BWFRYVEFJTCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT50eHRhaWwgPSB5aS5jZmcudHh0YWlsOworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9QRVJTSVNUKSB7CisJCQlpZiAoeWkuY2ZnLnBlcnNpc3QgPiBZQU1fTUFYUEVSU0lTVCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT5wZXJzID0geWkuY2ZnLnBlcnNpc3Q7CisJCX0KKwkJaWYgKHlpLmNmZy5tYXNrICYgWUFNX1NMT1RUSU1FKSB7CisJCQlpZiAoeWkuY2ZnLnNsb3R0aW1lID4gWUFNX01BWFNMT1RUSU1FKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJeXAtPnNsb3QgPSB5aS5jZmcuc2xvdHRpbWU7CisJCQl5cC0+c2xvdGNudCA9IHlwLT5zbG90IC8gMTA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNJT0NZQU1HQ0ZHOgorCQl5aS5jZmcubWFzayA9IDB4ZmZmZmZmZmY7CisJCXlpLmNmZy5pb2Jhc2UgPSB5cC0+aW9iYXNlOworCQl5aS5jZmcuaXJxID0geXAtPmlycTsKKwkJeWkuY2ZnLmJpdHJhdGUgPSB5cC0+Yml0cmF0ZTsKKwkJeWkuY2ZnLmJhdWRyYXRlID0geXAtPmJhdWRyYXRlOworCQl5aS5jZmcubW9kZSA9IHlwLT5kdXBtb2RlOworCQl5aS5jZmcudHhkZWxheSA9IHlwLT50eGQ7CisJCXlpLmNmZy5ob2xkZGx5ID0geXAtPmhvbGRkOworCQl5aS5jZmcudHh0YWlsID0geXAtPnR4dGFpbDsKKwkJeWkuY2ZnLnBlcnNpc3QgPSB5cC0+cGVyczsKKwkJeWkuY2ZnLnNsb3R0aW1lID0geXAtPnNsb3Q7CisJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJnlpLCBzaXplb2Yoc3RydWN0IHlhbWRydl9pb2N0bF9jZmcpKSkKKwkJCSByZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB5YW1fc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkcjsKKworCS8qIGFkZHIgaXMgYW4gQVguMjUgc2hpZnRlZCBBU0NJSSBtYWMgYWRkcmVzcyAqLworCW1lbWNweShkZXYtPmRldl9hZGRyLCBzYS0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCB5YW1fc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWFtX3BvcnQgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXlwLT5tYWdpYyA9IFlBTV9NQUdJQzsKKwl5cC0+Yml0cmF0ZSA9IERFRkFVTFRfQklUUkFURTsKKwl5cC0+YmF1ZHJhdGUgPSBERUZBVUxUX0JJVFJBVEUgKiAyOworCXlwLT5pb2Jhc2UgPSAwOworCXlwLT5pcnEgPSAwOworCXlwLT5kdXBtb2RlID0gMDsKKwl5cC0+aG9sZGQgPSBERUZBVUxUX0hPTEREOworCXlwLT50eGQgPSBERUZBVUxUX1RYRDsKKwl5cC0+dHh0YWlsID0gREVGQVVMVF9UWFRBSUw7CisJeXAtPnNsb3QgPSBERUZBVUxUX1NMT1Q7CisJeXAtPnBlcnMgPSBERUZBVUxUX1BFUlM7CisJeXAtPmRldiA9IGRldjsKKworCWRldi0+YmFzZV9hZGRyID0geXAtPmlvYmFzZTsKKwlkZXYtPmlycSA9IHlwLT5pcnE7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZGV2LT5vcGVuID0geWFtX29wZW47CisJZGV2LT5zdG9wID0geWFtX2Nsb3NlOworCWRldi0+ZG9faW9jdGwgPSB5YW1faW9jdGw7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB5YW1fc2VuZF9wYWNrZXQ7CisJZGV2LT5nZXRfc3RhdHMgPSB5YW1fZ2V0X3N0YXRzOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmeXAtPnNlbmRfcXVldWUpOworCisjaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisJZGV2LT5oYXJkX2hlYWRlciA9IGF4MjVfZW5jYXBzdWxhdGU7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IGF4MjVfcmVidWlsZF9oZWFkZXI7CisjZWxzZQkJCQkJCQkvKiBDT05GSUdfQVgyNSB8fCBDT05GSUdfQVgyNV9NT0RVTEUgKi8KKwlkZXYtPmhhcmRfaGVhZGVyID0gTlVMTDsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyID0gTlVMTDsKKyNlbmRpZgkJCQkJCQkvKiBDT05GSUdfQVgyNSB8fCBDT05GSUdfQVgyNV9NT0RVTEUgKi8KKworCWRldi0+c2V0X21hY19hZGRyZXNzID0geWFtX3NldF9tYWNfYWRkcmVzczsKKworCWRldi0+dHlwZSA9IEFSUEhSRF9BWDI1OwkvKiBBRl9BWDI1IGRldmljZSAqLworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gNzM7CS8qIFdlIGRvIGRpZ2lwZWF0ZXJzIG5vdyAqLworCWRldi0+bXR1ID0gMjU2OwkJCQkvKiBBWDI1IGlzIHRoZSBkZWZhdWx0ICovCisJZGV2LT5hZGRyX2xlbiA9IDc7CQkJLyogc2l6ZW9mIGFuIGF4LjI1IGFkZHJlc3MgKi8KKwltZW1jcHkoZGV2LT5icm9hZGNhc3QsIGF4MjVfYmNhc3QsIDcpOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBheDI1X3Rlc3QsIDcpOworCit9CisKK3N0YXRpYyBpbnQgX19pbml0IHlhbV9pbml0X2RyaXZlcih2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGksIGVycjsKKwljaGFyIG5hbWVbSUZOQU1TSVpdOworCisJcHJpbnRrKHlhbV9kcnZpbmZvKTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXNwcmludGYobmFtZSwgInlhbSVkIiwgaSk7CisJCQorCQlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCB5YW1fcG9ydCksIG5hbWUsCisJCQkJICAgeWFtX3NldHVwKTsKKwkJaWYgKCFkZXYpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAieWFtOiBjYW5ub3QgYWxsb2NhdGUgbmV0IGRldmljZSAlc1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJCisJCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ5YW06IGNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQl5YW1fZGV2c1tpXSA9IGRldjsKKworCX0KKworCXlhbV90aW1lci5mdW5jdGlvbiA9IHlhbV9kb3RpbWVyOworCXlhbV90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaIC8gMTAwOworCWFkZF90aW1lcigmeWFtX3RpbWVyKTsKKworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJ5YW0iLCBTX0lSVUdPLCAmeWFtX2luZm9fZm9wcyk7CisJcmV0dXJuIDA7CisgZXJyb3I6CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KHlhbV9kZXZzW2ldKTsKKwkJZnJlZV9uZXRkZXYoeWFtX2RldnNbaV0pOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgX19leGl0IHlhbV9jbGVhbnVwX2RyaXZlcih2b2lkKQoreworCXN0cnVjdCB5YW1fbWNzICpwOworCWludCBpOworCisJZGVsX3RpbWVyKCZ5YW1fdGltZXIpOworCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB5YW1fZGV2c1tpXTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9CisKKwl3aGlsZSAoeWFtX2RhdGEpIHsKKwkJcCA9IHlhbV9kYXRhOworCQl5YW1fZGF0YSA9IHlhbV9kYXRhLT5uZXh0OworCQlrZnJlZShwKTsKKwl9CisKKwlwcm9jX25ldF9yZW1vdmUoInlhbSIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworTU9EVUxFX0FVVEhPUigiRnJlZGVyaWMgUmlibGUgRjFPQVQgZnJpYmxlQHRlYXNlci5mciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJZYW0gYW1hdGV1ciByYWRpbyBtb2RlbSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoeWFtX2luaXRfZHJpdmVyKTsKK21vZHVsZV9leGl0KHlhbV9jbGVhbnVwX2RyaXZlcik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0xMjAwLmggYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0xMjAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNjYThhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbTEyMDAuaApAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqCisgKiBGaWxlIHlhbTFrMmI1Lm1jcyBjb252ZXJ0ZWQgdG8gaCBmb3JtYXQgYnkgbWNzMmgKKyAqCisgKiAoQykgRjZGQkIgMTk5OAorICoKKyAqIFR1ZSBBdWcgMjUgMjA6MjQ6MDggMTk5OAorICoKKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBiaXRzXzEyMDBbXT0geworMHhmZiwweGYyLDB4MDAsMHhhNSwweGFkLDB4ZmYsMHhmZSwweDlmLDB4ZmYsMHhlZiwweGYzLDB4Y2IsMHhmZiwweGRiLDB4ZmMsMHhmMiwKKzB4ZmYsMHhmNiwweGZmLDB4M2MsMHhiZiwweGZkLDB4YmYsMHhkZiwweDZlLDB4M2YsMHg2ZiwweGYxLDB4N2QsMHhiNCwweGZkLDB4YmYsCisweGRmLDB4NmYsMHgzZiwweDZmLDB4ZjcsMHgwYiwweGZmLDB4ZGIsMHhmZCwweGYyLDB4ZmYsMHhmNiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmMCwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YmYsCisweGZmLDB4ZmYsMHhmNywweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGZjLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGYwLAorMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmUsMHg3ZiwweGJmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGZmLDB4ZmIsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDlmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhmZiwKKzB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGY3LDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZjAsMHg1ZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZWYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhkZiwweGY3LDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlYiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmQsMHhmZiwweGJmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGY3LDB4YmYsMHhlNywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDc3LDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGRiLAorMHhmZiwweGZmLDB4ZjUsMHhhNSwweGZkLDB4NGIsMHg2ZSwweGVmLDB4MzMsMHgzMiwweGRkLDB4ZDMsMHg0YSwweGQ2LDB4OTIsMHhmZSwKKzB4YjMsMHgzZiwweGJkLDB4ZjEsMHhmYSwweGRiLDB4ZmUsMHhmNywweGY2LDB4OTYsMHhiZCwweGJkLDB4ZmYsMHhiZCwweGZmLDB4ZWQsCisweDdmLDB4NmIsMHg3ZiwweGZiLDB4ZGYsMHhmZSwweGZiLDB4ZmUsMHg5MCwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZSwweGVmLAorMHhmZiwweGZmLDB4ZGIsMHg1ZiwweGY2LDB4ZmYsMHhmNiwweDhmLDB4ZmQsMHhhNSwweGRkLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg2ZiwKKzB4N2YsMHhkYiwweGYxLDB4ZmMsMHhiZiwweGZmLDB4NmYsMHhmZiwweGVmLDB4ZmMsMHg1YiwweDVkLDB4ZGEsMHhkZiwweGY0LDB4ZmYsCisweGYyLDB4ZmYsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZDAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZiLDB4ZWYsMHhiNywweGZjLDB4MzMsMHhmZiwweGZiLDB4ZmYsMHgwNCwweDZhLDB4ZjMsMHgzYywweDM2LDB4ZmYsMHhmMCwKKzB4MGYsMHhmMSwweDBmLDB4ZmYsMHhmZiwweGZmLDB4ZjMsMHgxNSwweDcyLDB4MGYsMHhmMSwweDZmLDB4ZmYsMHhmZSwweDk0LDB4M2YsCisweGZmLDB4ZmYsMHhmZiwweDdiLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGYwLAorMHhmNywweGVmLDB4YjcsMHhmYywweDMzLDB4ZmYsMHhmZiwweGZmLDB4MDQsMHg2YSwweGYzLDB4M2MsMHgzNiwweGZmLDB4ZjAsMHgwZiwKKzB4ZjEsMHgwZiwweGZmLDB4ZmYsMHhmZiwweGYzLDB4MTUsMHg3MywweDhmLDB4ZjIsMHg2ZiwweGZmLDB4ZmUsMHg5NCwweDNmLDB4ZmYsCisweGZmLDB4ZmYsMHg3ZCwweDlmLDB4ZmYsMHhmMCwweDBmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDllLAorMHhmZiwweGZjLDB4ZWYsMHhkMywweGZiLDB4ZmYsMHg3ZiwweGY1LDB4NWYsMHhmZSwweDU5LDB4ZmYsMHhmZiwweGZmLDB4ZmMsMHhmMSwKKzB4ZmUsMHg3ZiwweGZmLDB4ZmYsMHhmYSwweDE3LDB4ZmYsMHhlNywweGVmLDB4ZWYsMHhmZiwweGZmLDB4M2YsMHhmMSwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhmZiwweGJmLDB4ZmYsMHhmYywweGVhLAorMHhmZiwweGYwLDB4ZmYsMHhmZiwweGJmLDB4ZjksMHgzZiwweGIxLDB4ZWYsMHhmZiwweGQ3LDB4ZmYsMHhmYiwweGZmLDB4ZjAsMHhmZiwKKzB4ZmYsMHhmMywweGZmLDB4ZGYsMHhmZiwweDdiLDB4ZmYsMHhmZCwweGZmLDB4ZjYsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGJmLDB4ZmYsCisweGZmLDB4ZmYsMHhkYSwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYyLDB4YzAsMHgwMSwweDAwLDB4MDAsMHgwMiwweDAyLAorMHgwMiwweDAyLDB4MDAsMHg0MCwweDQwLDB4NDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOSwweDAwLDB4MDQsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsCisweDAwLDB4M2MsMHhmMCwweGFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmZCwweGZmLAorMHhmZiwweDdmLDB4ZmYsMHhmZiwweGJmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZGYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGJmLDB4ZmUsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsCisweGRiLDB4ZjAsMHg2ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjAsMHhiZiwweGRmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhkZiwweGRmLDB4ZmYsMHhlZiwweGZmLDB4OWUsMHhlZiwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZjEsMHhlZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjcsMHhmYSwweGJmLDB4ZmYsMHhmZiwweGZlLDB4NDcsMHhlZiwweGZmLDB4YmQsMHhmNiwweGZmLDB4ZmYsMHhkZiwweGY1LDB4ZjAsCisweGYwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY4LDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDEsMHgwMiwweDA4LAorMHgxNiwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwMSwweDAyLDB4MDAsMHg4MCwweDAxLDB4MGMsMHgwMiwweDAwLDB4MDAsMHgwMSwKKzB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMCwweDA2LDB4MDAsMHgyMCwweDAwLDB4MTAsMHgwMCwweDE0LDB4MDAsMHgwNCwweGMxLDB4ZjAsCisweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmZiwweDdmLAorMHhlYywweGZmLDB4ZmYsMHhmYSwweGZmLDB4YmYsMHhmZiwweDZmLDB4ZmYsMHhlMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YmQsMHhmZSwKKzB4NDYsMHhmZiwweGVmLDB4N2YsMHhjZCwweGRmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhiZCwweGZmLDB4N2YsMHg3ZiwweGYwLDB4NGYsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDBmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZkLDB4YTQsMHhiYywweGNkLDB4NmQsMHg2YiwweDZmLDB4NWIsMHhkYywweDMzLAorMHg1YSwweGY2LDB4ZjcsMHhmNiwweGIzLDB4M2YsMHhiZCwweGMxLDB4ZmEsMHg1YSwweGY2LDB4ZjYsMHhiNiwweGY3LDB4ZmYsMHhiZCwKKzB4YmIsMHgzYywweGNlLDB4Y2YsMHgzNCwweGVmLDB4MzMsMHhiYiwweGNjLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg0ZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZmYsMHhmNiwweGQ2LDB4ZmYsMHhmZCwweGZkLDB4YmYsMHhmZiwweGFkLAorMHhiZiwweGY5LDB4N2YsMHg2ZiwweGZjLDB4ZGIsMHhmMSwweGZkLDB4YmYsMHhmZiwweDZmLDB4ZmYsMHhmZiwweGRhLDB4ZGIsMHhmYywKKzB4ZGIsMHhmZiwweDc2LDB4OGYsMHhmNiwweGZmLDB4Y2QsMHhhYiwweGZlLDB4ZmIsMHhmZiwweGQwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4ZmYsMHg5ZiwweGZmLDB4ZjQsMHgyMCwweGFmLDB4NmQsMHgwYiwweGMxLDB4N2IsMHhmZiwweGZmLDB4ZmYsMHhjYiwweGZmLAorMHgzZiwweGYwLDB4ZWYsMHg3ZiwweDBmLDB4ZjEsMHhjMywweDNjLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjgsMHgwYiwKKzB4MWQsMHg2YSwweDY0LDB4MDUsMHg2YiwweDk5LDB4MDEsMHhmZiwweGZkLDB4ZWYsMHhmMCwweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGZmLDB4ZmYsMHhmZiwweGY0LDB4MDAsMHgyZiwweGNjLDB4MGIsMHhjMywweDdmLDB4ZmYsMHhmZiwweGZmLDB4MGEsMHhkZiwweGJmLAorMHhmZCwweDdmLDB4ZmYsMHhmZiwweGYxLDB4YzMsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4NGEsMHgwZSwKKzB4OTYsMHg2NCwweDAyLDB4OTcsMHg5OSwweDEwLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweDg0LDB4ZjksMHhkNSwweDI3LDB4ZjEsMHg3ZiwweGZmLDB4ZjgsMHhlYiwweGRmLDB4ZjMsMHhjZiwweDNmLAorMHgxZiwweGZmLDB4ZjcsMHgxMSwweGZmLDB4Y2YsMHhmZiwweGZlLDB4NjcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGM0LDB4ZmYsMHhmZiwKKzB4YjMsMHhhMSwweGZmLDB4ZjksMHhlMCwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY1LDB4ZmYsCisweGZmLDB4ZmIsMHg3ZiwweGUwLDB4ZmYsMHhjNywweGZlLDB4N2YsMHgzZiwweGZmLDB4ZmQsMHg3NywweDhkLDB4N2YsMHgwZiwweGZmLAorMHhjMywweGZmLDB4ZjEsMHhiZiwweDhmLDB4Y2YsMHhmZiwweGZmLDB4ZGQsMHg3YiwweGZmLDB4ZjYsMHhmYSwweGY3LDB4ZmYsMHg0MCwKKzB4OWYsMHhmOSwweDdmLDB4ZDgsMHhmZiwweGZmLDB4ZmEsMHhmMCwweDFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMSwweGMwLDB4MDAsCisweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDEwLAorMHgwMCwweDAxLDB4MDAsMHgxMCwweDIwLDB4MjAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDA0LDB4MDEsMHgwNSwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg0MCwweDQwLDB4MDAsMHgwMCwweDNjLDB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmQsMHhiZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweDdmLDB4N2YsMHhmZiwweGVmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhlZiwweGY3LAorMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZjcsMHhmZiwweGZmLDB4ZmYsMHhmYywweGZkLDB4ZmYsMHg3ZiwKKzB4N2UsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGYwLDB4NmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYwLDB4YmIsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGViLDB4ZmQsMHg2ZiwweGZmLDB4ZjcsMHhmZSwweGY1LDB4N2YsMHhmZiwweGZmLDB4N2YsMHhiZiwweGIxLAorMHhmZiwweGZmLDB4OWYsMHhiZiwweGZiLDB4ZmYsMHhmZSwweGZmLDB4ZmUsMHhmZiwweGY3LDB4ZWIsMHhkZiwweGJmLDB4NWYsMHhkZCwKKzB4ZmYsMHhkYiwweGZkLDB4ZDAsMHhmMCwweDZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmOCwweDMwLDB4MjAsMHgwMCwweDQyLDB4MDAsCisweDAwLDB4MDAsMHgzMCwweDE4LDB4MDQsMHgwOCwweDA5LDB4MjEsMHg4MiwweDgwLDB4MDIsMHgwMCwweDA4LDB4MDAsMHgwMSwweDAwLAorMHgwMCwweDAwLDB4MGMsMHgyMCwweDEwLDB4MDAsMHgxMSwweDAwLDB4NDQsMHg4NCwweDAwLDB4MjAsMHgyMCwweDg0LDB4ODAsMHgwMCwKKzB4MDAsMHgwMCwweGMxLDB4ZjAsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmNywweGZmLDB4ZmIsMHhkZCwweGY5LDB4ZmYsCisweGRhLDB4ZmYsMHhkYywweGRkLDB4ZmMsMHhmYiwweGZmLDB4YmYsMHhmYiwweDNlLDB4ZDcsMHg5NiwweGZlLDB4NjEsMHhmNywweGZmLAorMHg3ZiwweGZmLDB4M2YsMHhmZCwweGZmLDB4ZGYsMHhjZiwweGY3LDB4ZGYsMHhmNywweGJmLDB4ZmQsMHhmZiwweGZlLDB4ZWYsMHhlZiwKKzB4ZmUsMHhmZiwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmMCwweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmMywweGJkLDB4ZmQsMHg0YiwweDc0LDB4Y2YsCisweDczLDB4NWIsMHhjYiwweDNiLDB4ZGYsMHhmZSwweGY3LDB4ZmUsMHhkMywweDc1LDB4YWMsMHhhMSwweGZiLDB4ZGYsMHhmZSwweGY3LAorMHg3NiwweDk2LDB4YjUsMHgyNCwweGJkLDB4YTUsMHhhZCwweDQ5LDB4MmYsMHg2OSwweDJiLDB4NTIsMHg1YiwweGJkLDB4ZmYsMHhmZiwKKzB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGZmLDB4ZjYsMHhmZSwweGZmLDB4Y2MsCisweGE3LDB4ZmIsMHhhZCwweGZmLDB4N2YsMHg2ZiwweGZmLDB4NmQsMHg3ZiwweGRiLDB4ZjEsMHhmZCwweGJmLDB4ZmYsMHg2ZiwweGZmLAorMHg2ZiwweGZmLDB4ZGIsMHhmZiwweGRiLDB4ZmYsMHhmNiwweDk3LDB4ZjYsMHhmZiwweGI1LDB4YjUsMHhmZiwweGZmLDB4ZmYsMHhkMCwKKzB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZkLDB4YTUsMHhiYywweDQzLDB4ZmMsMHg3YywweDAzLDB4ZTcsCisweGZmLDB4ZmYsMHgyMCwweGZmLDB4ZmYsMHhmZiwweGNjLDB4ZmQsMHg3ZCwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkNSwweDU5LAorMHhiYSwweDU2LDB4NjYsMHg2YSwweGFkLDB4OWEsMHhhOSwweDlhLDB4OTcsMHhhNSwweGFhLDB4YmIsMHhmZiwweGZmLDB4ZjAsMHgwZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZSwweGZiLDB4ZmYsMHhmZCwweGY3LDB4ZmQsMHg0MywweGZmLDB4ZmQsMHg2YiwweGU3LDB4ZmYsCisweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4M2YsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZDUsMHg1OSwweGI1LAorMHhhNiwweDY2LDB4NmEsMHhhZCwweDlhLDB4YTksMHg5OSwweDZiLDB4NWEsMHhhYSwweGZmLDB4ZmYsMHhiNywweGYwLDB4M2YsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHg5YywweGY3LDB4ZmQsMHhkMiwweDQxLDB4ZmYsMHhmZiwweGYyLDB4N2YsCisweDhmLDB4ZmYsMHhmZiwweDNkLDB4ZjMsMHhmZiwweDE3LDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhkZiwweGZjLAorMHg4ZiwweDM4LDB4ZmYsMHhlZiwweDIzLDB4ZmYsMHhmYiwweGY3LDB4YzgsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDlmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGY1LDB4N2YsMHhmZiwweGZkLDB4ZmYsMHhlNCwweGZmLDB4ZWIsMHhmZiwweGNmLDB4YmYsMHhmYSwweGZmLDB4YWIsCisweGVmLDB4ZmYsMHhmYiwweGZmLDB4ZjMsMHhmZCwweDYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYSwweGZmLDB4ZmIsMHhmZCwweDBkLAorMHhmZiwweGZlLDB4ZmYsMHg0MywweDdmLDB4ZmUsMHhiZiwweGQwLDB4ZmQsMHhmZiwweGZhLDB4ZjAsMHgzZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmMywweGMwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAyLDB4MDEsMHgwMCwweDYwLDB4YzAsMHg0MCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgzNCwweDA0LDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHg4OCwweDAwLAorMHgwMCwweDAzLDB4MDAsMHgwMCwweDQwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgzYywweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmQsMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4N2YsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhmZiwweGZmLDB4ZmYsMHhmZCwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZlLDB4NWYsMHhmZiwweGZmLDB4Y2IsMHhmMCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMCwKKzB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhlZiwweGUzLDB4ZGUsMHhlZSwweGQ5LDB4YzUsMHg5MywweGZmLDB4ZmYsMHhmZSwweGZlLDB4ZmYsCisweGZiLDB4ZWUsMHhmZSwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhiZiwweGY3LDB4ZmYsMHhmZiwweDdmLAorMHhhZiwweGJkLDB4ZGYsMHhkZiwweGZiLDB4ZjMsMHhmMywweGYwLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjgsMHgzNCwKKzB4MDAsMHgwNiwweDYxLDB4MDAsMHgxOCwweDAxLDB4YTAsMHgwNSwweDE3LDB4MDAsMHgyMCwweDA1LDB4MjgsMHgyMCwweDAwLDB4MDAsCisweDA1LDB4MDAsMHg0MSwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDksMHgwMCwweDAxLDB4MjAsMHg4NiwweDgyLDB4MDgsMHg0MCwweDAzLAorMHg4MCwweDMwLDB4NzAsMHgwOCwweDE0LDB4MDIsMHhjMSwweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGJkLDB4ZWYsMHhmYiwweGZmLDB4ZmYsMHhmYiwweDljLDB4N2YsMHhlZiwweGRmLDB4ZmYsMHhiZiwweGViLDB4ZGUsCisweGZmLDB4YzEsMHg3ZiwweGZmLDB4ZmIsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhiZiwweGVmLAorMHgzZiwweGY3LDB4OGYsMHhlZiwweDdmLDB4ZmYsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhiZCwKKzB4ZGYsMHhlZiwweDdkLDB4NmQsMHgyYiwweDVhLDB4NWQsMHhkMiwweGRmLDB4ZjYsMHg5MiwweGI2LDB4YjIsMHhiMywweGFjLDB4YTEsCisweGZiLDB4ZGYsMHhmZSwweGYxLDB4ZWUsMHhmNSwweGY2LDB4YmMsMHg2YiwweGJkLDB4N2QsMHhhZiwweDFhLDB4ZWYsMHg1ZiwweDZiLAorMHhjNiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4NWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZGIsMHhmZiwKKzB4ZjYsMHhmZiwweGY2LDB4YjcsMHhmZCwweGFkLDB4ZmQsMHhiZiwweGYzLDB4NmYsMHhmZiwweDZmLDB4ZmYsMHhkYiwweGQxLDB4ZmQsCisweGJmLDB4ZmYsMHg2ZiwweGY1LDB4NmIsMHhiYywweDViLDB4M2MsMHhkYSwweGVmLDB4MTYsMHhhZiwweDE2LDB4ZmYsMHhjZCwweGFiLAorMHhmZiwweDZmLDB4ZmYsMHhkMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmYywweGJmLDB4ZmYsMHhmZiwKKzB4ZmYsMHg2YywweDAzLDB4MTAsMHhjMSwweGYzLDB4ZmYsMHhmMywweDNhLDB4ZjMsMHhjYSwweGZmLDB4YWYsMHhmMSwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhkOSwweDk2LDB4YTYsMHg2NSwweGE2LDB4NjYsMHg2YSwweDk1LDB4NjksMHg2OSwweDZhLDB4NWEsMHg1YSwweGZmLAorMHhmZiwweDVmLDB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZWEsMHgwZiwweDUwLDB4YzMsMHhmMywweDdmLDB4ZmYsMHhmMywweGYzLDB4YzMsMHhmZiwweGFmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZDksMHg5NiwweGE2LDB4NjUsMHhhNiwweDY2LDB4NmEsMHg5NSwweDY5LDB4NjksMHg2YSwweDVhLDB4NWEsMHhmZiwweGZmLAorMHhmZiwweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZDcsMHhmZiwweGZmLDB4NWYsMHhjMSwKKzB4M2YsMHhmNywweDVlLDB4ZjUsMHhjZSwweDllLDB4NWYsMHgzZiwweDE3LDB4ZmYsMHhmMywweGUxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGQ4LDB4ZmYsMHhmYSwweGZlLDB4NjcsMHhmZiwweGZlLDB4YmYsMHg1YSwweGZmLDB4ZmYsMHhhZiwweGY1LDB4ZmYsMHhmZiwweGZmLAorMHhmMCwweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNSwweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZjcsMHhmZiwweGZkLDB4NGUsMHgzZCwKKzB4M2YsMHhlNywweDBiLDB4YmYsMHg4ZiwweGY5LDB4ZmYsMHhlYiwweGUzLDB4ZmYsMHhlMSwweGZmLDB4ZmYsMHhmYywweGZmLDB4YzcsCisweDlmLDB4ZmYsMHgzZSwweDM5LDB4ZTUsMHhmZiwweGNmLDB4OWIsMHhmOSwweGZmLDB4ZmYsMHhjNSwweGZmLDB4ZmYsMHhmYSwweGYwLAorMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjMsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MjAsCisweDAwLDB4MDEsMHgxMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHhmMCwweDRmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZkLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhiZiwKKzB4M2YsMHhmZiwweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGZmLDB4ZjcsCisweGZmLDB4ZWQsMHhmZiwweGZiLDB4ZmUsMHhmZiwweDdmLDB4ZmYsMHg3ZiwweGRmLDB4ZmYsMHhmZiwweGRkLDB4ZjAsMHgzZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmMCwweGZmLDB4ZmYsMHhmMywweGZmLDB4ZjcsMHhmZiwweGZlLDB4NWYsMHhmZiwweGY3LDB4ZmYsMHhmZiwKKzB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGZlLDB4N2IsMHhmMSwweGZmLDB4ZmQsMHhmZCwweGZmLDB4ZGYsMHhkZiwweGZmLDB4N2QsCisweDczLDB4ZjksMHhmZiwweGMzLDB4N2UsMHhmZSwweGZmLDB4ZWYsMHhkNywweGZmLDB4Y2YsMHhkMCwweGYwLDB4NmYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZjgsMHgzMCwweDAwLDB4MDAsMHg0MCwweDA0LDB4MDAsMHgwMSwweDQxLDB4MjAsMHgwMCwweDA0LDB4MDAsMHgwMiwKKzB4ZDUsMHgwOSwweDAwLDB4MDIsMHg4MCwweDAyLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwYSwweDA0LDB4MDAsMHgwNywweDAwLDB4MDEsCisweDUwLDB4MDEsMHg4MCwweDAyLDB4NjEsMHg0MCwweDQxLDB4MGMsMHgxNCwweDA4LDB4YzEsMHhmMCwweDlmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhkZiwweGNiLDB4NWYsMHhmZSwweGVmLDB4ZmYsMHhmZSwKKzB4ZmYsMHgzZiwweGZmLDB4N2YsMHhmZCwweGMxLDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHhkZiwweGZkLDB4ZmMsMHhmZCwweGY3LDB4ZWUsCisweGZmLDB4ZmYsMHg0ZSwweGZmLDB4ZGYsMHhjZiwweGRiLDB4ZWIsMHhmZiwweGZmLDB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweDdmLAorMHhmZiwweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjcsMHhmYiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHhmMCwweDFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhkZCwweGZmLAorMHhmZiwweGZmLDB4YTUsMHhmZiwweDZmLDB4NmIsMHhlOSwweDZmLDB4ZGEsMHhjYSwweGZiLDB4ZGQsMHhlZSwweGY3LDB4ZjYsMHhiMiwKKzB4YjMsMHhhNCwweGExLDB4NWIsMHg1YiwweGY2LDB4ZDcsMHhmNCwweGY3LDB4N2IsMHhiZCwweGJkLDB4YWQsMHhjZiwweGVmLDB4N2YsCisweDZiLDB4N2YsMHgzYiwweGRmLDB4ZGIsMHhmZiwweGZmLDB4MzAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmNiwweGZlLDB4OTYsMHhmZiwweGZkLDB4YjUsMHhmZCwweGJmLDB4YWQsMHg3ZiwweGZmLDB4NmYsMHhmZiwKKzB4ZGUsMHhkMSwweGFkLDB4YWQsMHhlOSwweGZmLDB4ZjEsMHhlYywweGVmLDB4ZGUsMHgzZiwweGNiLDB4ZmYsMHhmNiwweGZmLDB4MzIsCisweGZmLDB4YzUsMHhiZCwweGZmLDB4ZmYsMHhmZiwweGQwLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZlLDB4ZmIsMHhmZiwweGY0LAorMHgyOCwweGJmLDB4ZmYsMHhmZCwweGZiLDB4ZDMsMHhmZiwweGZmLDB4NDIsMHhmZiwweGZmLDB4ZmYsMHhlYSwweGIzLDB4ZmMsMHhjMywKKzB4YzEsMHhmZiwweDMzLDB4ZmYsMHhjMCwweDE1LDB4NmIsMHg3MCwweGZmLDB4ZjAsMHhmMiwweDRmLDB4ZmYsMHhmYywweDNlLDB4OTcsCisweDNjLDB4ZmYsMHhmZiwweGZkLDB4ZWYsMHhmMCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZSwweDc4LAorMHhiZiwweGZmLDB4ZmQsMHhmMywweGVmLDB4NTUsMHhmZiwweDdlLDB4ZmYsMHhmZiwweGZmLDB4ZWEsMHhiMywweGZjLDB4YzMsMHhjMSwKKzB4ZmYsMHgzMywweGZmLDB4YzAsMHgxNSwweDZmLDB4ZmYsMHgwZiwweGYwLDB4ZjAsMHgwZiwweGZmLDB4ZmMsMHgzZCwweDZiLDB4YzMsCisweGZmLDB4ZmYsMHhmZSwweGY3LDB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYywweGZmLAorMHhmZiwweDIzLDB4ZjgsMHg3ZiwweGZmLDB4NGUsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGY5LDB4MTcsMHhmZiwweGY2LDB4ZjEsMHhmZiwKKzB4Y2YsMHhlZiwweGZmLDB4ZmYsMHgxMywweGRmLDB4ZTYsMHgyZiwweGM3LDB4ZmYsMHhmZiwweGU3LDB4YzEsMHhmZCwweGZmLDB4ZmUsCisweGZmLDB4ZmYsMHhmZiwweGYwLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY1LDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhhZSwweGZmLAorMHhmZiwweDdmLDB4M2IsMHgzZiwweGZjLDB4N2YsMHhmYywweGVmLDB4ZmYsMHhmYywweGUyLDB4N2IsMHhmZiwweGYxLDB4ZmQsMHhlZCwKKzB4ZWYsMHhmZiwweGZmLDB4MzUsMHg3MywweGZmLDB4ZmYsMHhmZSwweGZhLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsCisweGZmLDB4ZmEsMHhmMCwweDhmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMSwweGMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDQsMHgwMSwweDQwLDB4NDAsMHgwMCwKKzB4MDAsMHgzMCwweDI4LDB4MDQsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDM4LDB4ZjAsMHgwZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmQsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweDdmLAorMHhmZiwweGZmLDB4OWYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGRmLDB4ZGYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZWQsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGJmLDB4YmYsMHhmZiwweGZmLDB4YzMsCisweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYwLDB4YmYsMHhmZCwweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmQsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZCwweDdiLDB4ZmYsMHg3ZiwweGZmLDB4YmQsMHhmZiwweGYxLDB4ZWYsMHhmZiwweGZmLDB4ZmQsMHhkZiwKKzB4ZmQsMHhmYiwweGZmLDB4ZmYsMHhiZiwweGJlLDB4ZmYsMHhjZCwweDdmLDB4ZmMsMHhmNywweGY3LDB4NmYsMHhiZiwweGQ4LDB4ZjAsCisweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmOCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4YTAsMHgwMCwweDAwLAorMHhjMCwweDAwLDB4MDAsMHgyMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MGMsMHg4MSwweDAwLDB4MjAsMHhhNCwweDIwLDB4MDAsMHgxMCwKKzB4MDgsMHgwNCwweDQ4LDB4MDgsMHgwMCwweDQwLDB4OTMsMHgwMCwweDEwLDB4MDAsMHgzOCwweDE4LDB4MjAsMHhjMSwweGYwLDB4M2YsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhiOSwweGRmLDB4ZmUsMHhiMywweGZmLDB4ZmYsMHhlNywweGZkLAorMHhmZiwweGZmLDB4M2IsMHhmZiwweDdmLDB4ZmYsMHhiZiwweGZmLDB4YzEsMHhmZiwweGZjLDB4ZmYsMHhmZiwweDNmLDB4NzcsMHhmZSwKKzB4ZmUsMHhjZiwweGZmLDB4YmYsMHhmZCwweGJmLDB4ZmYsMHhmZSwweGVkLDB4ZjIsMHhmZCwweGY3LDB4ZmYsMHhmMCwweDJmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhiZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmMywweGFkLDB4Y2YsMHhlZiwweDcwLDB4YzksMHg3MywweDNiLDB4ZGYsMHg1YiwweDRhLAorMHhmNiwweGI3LDB4ZmUsMHhkNywweGY1LDB4YmMsMHhjMSwweDMzLDB4Y2EsMHhkNiwweGI3LDB4NmUsMHhmNywweGZiLDB4YmQsMHhjNSwKKzB4MjQsMHhjZiwweDZmLDB4MmYsMHg0ZCwweDJiLDB4YmEsMHg1YSwweGZmLDB4ZmYsMHhmZiwweGYwLDB4YWYsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY2LDB4ZjYsMHhkNywweGZmLDB4ZmYsMHhhZCwweGJkLDB4ZmYsMHhmZiwweGZmLAorMHhlZiwweGY3LDB4N2YsMHhmYywweDViLDB4YjEsMHhmZCwweGJkLDB4NzUsMHg2ZiwweGVmLDB4NmEsMHhmZCwweDViLDB4ZmIsMHhkYiwKKzB4M2EsMHhiZiwweDhlLDB4OWYsMHhmZiwweGJmLDB4ZmQsMHhmZiwweDZmLDB4ZmYsMHhkMCwweDZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGZmLDB4YmIsMHhmZiwweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmQsMHhmYiwweDdmLDB4ZGUsMHhmZiwweGZmLDB4NWEsMHhkNiwweGJmLAorMHhkOCwweDJhLDB4YmYsMHhiZiwweGYxLDB4ZTUsMHhmZiwweGNjLDB4YzAsMHhhOSwweDcwLDB4ZmYsMHhmMywweDNjLDB4M2MsMHhmZCwKKzB4NTcsMHhmZCwweDk4LDB4MDMsMHgwMCwweGMzLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweDNkLDB4YmYsMHhmZiwweGZkLDB4ZmIsMHhmZiwweGRiLDB4ZmYsMHhmZiwweDBmLDB4ZmMsMHgzZiwweGQ4LAorMHgyYSwweGJmLDB4YmYsMHhmMSwweGVmLDB4ZmYsMHhjYywweGMwLDB4OTYsMHhiZSwweGZmLDB4ZjMsMHgzZiwweGZmLDB4ZmQsMHg1NywKKzB4ZmQsMHg5OSwweDBmLDB4ZmYsMHhjMywweGZmLDB4ZmYsMHhmZiwweGYwLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsCisweGZmLDB4ZjEsMHhlNywweGZmLDB4ZmYsMHhmMywweDhlLDB4N2IsMHhmZiwweGE4LDB4ZmYsMHhkZiwweDdmLDB4OGUsMHg3OCwweDczLAorMHhmZiwweGYxLDB4NTEsMHg2MiwweGZmLDB4ZmMsMHg0YiwweGZmLDB4ZjMsMHhmZiwweDdlLDB4Y2YsMHhmOSwweGZmLDB4ZmQsMHhmZiwKKzB4ZmYsMHg3ZiwweGZmLDB4ZTAsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNSwweGZmLDB4ZmYsCisweGZiLDB4ZmQsMHhhZSwweGZmLDB4ZmMsMHhmZSwweDZmLDB4M2YsMHhmOCwweGZkLDB4NzcsMHhhZiwweGZlLDB4MzcsMHhmZSwweDdiLAorMHhmZiwweGIxLDB4OGMsMHhmZiwweGVmLDB4ZmQsMHhmOCwweGU3LDB4YmYsMHhmZiwweGYxLDB4ZmUsMHgzZSwweGY3LDB4ZmUsMHg5NSwKKzB4M2UsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZhLDB4ZjAsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjEsMHhjMCwweDAwLDB4MDAsCisweDAxLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDIsMHgwMCwweDAwLDB4MTAsMHgwMCwweDEwLDB4MDAsMHgxMCwweDA4LAorMHg0MSwweDgwLDB4MTAsMHgwMCwweDAwLDB4MDgsMHgxMCwweDg0LDB4MDAsMHgwYywweDA0LDB4MDIsMHg2MSwweDAwLDB4MDAsMHg4MSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzZCwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZkLDB4YmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZmUsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLAorMHg3ZiwweGJmLDB4ZjcsMHg3ZiwweGVmLDB4ZmYsMHhlZiwweGZmLDB4ZjcsMHhmZCwweGZmLDB4ZmYsMHhmZCwweDdmLDB4ZmYsMHhiZSwKKzB4ZGYsMHhmZiwweGZmLDB4ZDksMHhmMCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMCwweGJiLDB4ZmYsMHg3ZiwweGZiLDB4ZmYsCisweGZiLDB4ZmYsMHhiZiwweGZmLDB4ZjMsMHg3ZiwweGZiLDB4ZmQsMHhlYiwweDdmLDB4ZGYsMHhmYSwweGZmLDB4ZGUsMHhmMCwweGVkLAorMHhmZiwweGIxLDB4ZjcsMHhmOSwweDFmLDB4YjUsMHg1YiwweGZlLDB4N2UsMHhmNywweGJlLDB4ZmQsMHg3ZiwweDVmLDB4YjUsMHhmNywKKzB4ZmYsMHhmZiwweGQwLDB4ZjAsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjgsMHgzMCwweDAxLDB4MDAsMHgwNywweDQyLDB4MDEsCisweDAwLDB4NmEsMHgxOCwweDUwLDB4ODAsMHgwMCwweDAwLDB4MDIsMHg0MCwweDAxLDB4MDEsMHgyMCwweDAxLDB4MDEsMHgyNCwweDE0LAorMHgyMSwweDEwLDB4MDIsMHgwOCwweDA3LDB4MDgsMHgwMCwweDQwLDB4MTAsMHg4MCwweDU4LDB4MDAsMHg4NCwweDgwLDB4MTgsMHgxMCwKKzB4NDAsMHhjMSwweGYwLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhkYiwweGI3LDB4ZjMsCisweGRmLDB4N2MsMHhmOCwweDc0LDB4ZmYsMHhmZiwweDZmLDB4N2QsMHgzZiwweDdlLDB4ZWMsMHg3ZiwweGMxLDB4ZjUsMHhmZiwweGNmLAorMHg2ZiwweDlmLDB4ZjksMHhkZiwweGJlLDB4ZTUsMHhlNywweGZmLDB4ZDcsMHhmMywweGRkLDB4ZmIsMHhmZiwweGZjLDB4ZmYsMHhiZiwKKzB4ZmYsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjAsMHgyZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZDcsMHhmZiwweGZmLDB4ZmYsMHhiNCwweGNmLDB4ZWYsMHg3NywweDZmLDB4NzMsCisweDNhLDB4NGEsMHgzYSwweGNiLDB4ZDQsMHhmNywweDJlLDB4ZDYsMHhiZCwweGJkLDB4YTEsMHgzYiwweGRmLDB4ZDYsMHhmNywweGVlLAorMHhkMywweDM1LDB4YmQsMHhmYiwweGJkLDB4Y2UsMHhlYiwweDJiLDB4NGQsMHgyZiwweGJiLDB4ZGEsMHhmZiwweGZmLDB4ZmUsMHhiMCwKKzB4NWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHg1ZiwweDM2LDB4YWYsMHgzZiwweGVkLDB4YjcsCisweGY1LDB4ZmQsMHhmMywweDJiLDB4ZWYsMHg3NywweGZmLDB4ZmIsMHhkYSwweGIxLDB4YmQsMHhhMywweDc3LDB4NjksMHg3ZiwweDRmLAorMHhmZiwweGRiLDB4ZmEsMHg1YiwweGZmLDB4ZjIsMHhmZSwweGZmLDB4OTYsMHhmZiwweGZmLDB4ZmUsMHhkZiwweGZmLDB4ZDAsMHhhZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZCwweDhmLDB4ZmQsMHg0MCwweDZmLDB4OWUsMHg4MywweDVhLDB4MGYsCisweGZhLDB4YzMsMHhmZiwweGZmLDB4ZmMsMHhlOSwweDdmLDB4ZjMsMHgwMSwweGQwLDB4MDAsMHhmZSwweGJmLDB4Y2QsMHgzZiwweGYwLAorMHhlZiwweGZjLDB4YzUsMHgwYywweDNmLDB4ZmQsMHg2OCwweDBiLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhkZiwweGYwLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhiYiwweGZmLDB4ZmQsMHg4NSwweGZmLDB4ZDQsMHg2ZiwweDlmLDB4YzMsMHg1YSwweDBmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZjLDB4ZTksMHg3ZiwweGYzLDB4MDEsMHhmMCwweGZiLDB4YzIsMHhiZiwweGZjLDB4MDAsMHgzNywweGVmLAorMHhmYywweGNkLDB4YmMsMHgzZiwweGZmLDB4MGMsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDVmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZDksMHhmNywweGQxLDB4YjcsMHg3ZSwweDdmLDB4ZjEsMHhlNCwweGZkLDB4ZmYsCisweGZiLDB4ZmIsMHhmZiwweDVmLDB4ZmYsMHg3ZiwweGIxLDB4YmMsMHgwZiwweDY3LDB4ZWIsMHhiOCwweDNmLDB4ZmYsMHhlMiwweGZmLAorMHhlOSwweGZmLDB4ZmQsMHhlMywweGZmLDB4M2YsMHg5ZiwweGMyLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg5ZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmNSwweDdmLDB4ZmYsMHhmMCwweDNmLDB4YmMsMHhmZiwweGQ1LDB4ZjUsMHhjZSwweDNmLDB4ZmUsMHhmZiwweGZlLDB4NmQsCisweGZmLDB4ZjEsMHhiZiwweDdiLDB4ZmYsMHhmMSwweGZkLDB4ZmYsMHg0ZiwweGZmLDB4ODcsMHhmZiwweGFlLDB4ZmYsMHhiMSwweGY4LAorMHhmZSwweGZmLDB4ZmYsMHg3OCwweDAxLDB4YjksMHhmZiwweGZmLDB4ZmYsMHhmYSwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZjMsMHhjMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDIsMHgxMywweDAyLDB4MDAsMHg4MCwweDQwLDB4MDAsMHg5MCwweDEwLDB4MDAsCisweDEwLDB4MDAsMHgwMiwweDAwLDB4MDEsMHgyMCwweDgwLDB4MTIsMHgxMCwweDAwLDB4NDAsMHgwOCwweDAwLDB4MDQsMHgwMCwweDAwLAorMHgwMiwweDAwLDB4MDEsMHg0MCwweDAwLDB4ODAsMHgwMCwweDAwLDB4M2MsMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZCwKKzB4MWYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweDdmLDB4ZjcsMHhkZiwweGY3LDB4ZmYsCisweGY3LDB4ZmIsMHhlYiwweGQxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGY3LDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmZSwweGZmLAorMHhmZiwweDdlLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjAsMHhmZiwKKzB4ZmYsMHhiNywweGViLDB4ZjcsMHhkZiwweGZmLDB4ZmUsMHhmNSwweDZiLDB4ZTcsMHhlZCwweGY3LDB4M2UsMHhlYywweGZmLDB4NTQsCisweGVmLDB4NmYsMHhmMSwweGY1LDB4YWYsMHg2ZiwweGY2LDB4ZmQsMHhmZiwweGRkLDB4N2IsMHhmZiwweGVmLDB4YmYsMHg3ZiwweGZmLAorMHhmZiwweGY3LDB4ZmYsMHhmMywweDVmLDB4ZjcsMHhkMCwweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY4LDB4MzAsMHgwMCwKKzB4ODAsMHg0MCwweDA0LDB4MDAsMHg4MSwweDJjLDB4MDQsMHgyNCwweDAwLDB4MDIsMHgwMSwweGM4LDB4MDIsMHgwMCwweDAyLDB4MjQsCisweDAwLDB4MDEsMHhiNCwweDQyLDB4ZGMsMHg0NCwweDAyLDB4MTUsMHg5MCwweDAyLDB4MDMsMHg0OCwweDM5LDB4MTAsMHgwMiwweDI0LAorMHhhMCwweGJhLDB4MDAsMHgwMCwweDQwLDB4YzEsMHhmMCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmYywweGY3LDB4ZjAsMHhlZSwweGI2LDB4NWQsMHhmZCwweGY1LDB4ZmYsMHhkYiwweGY3LDB4N2YsMHg3ZiwweGJlLDB4ZmYsCisweGMxLDB4ZmUsMHhiZiwweGZhLDB4ZmEsMHg1ZiwweGZmLDB4YWQsMHhmZiwweGVmLDB4ZmYsMHg3ZiwweGRmLDB4N2YsMHhmZSwweGJmLAorMHhiNywweDk0LDB4YmYsMHhmZiwweGZmLDB4ZjAsMHg5ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4OGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGQ3LDB4ZmYsMHhmZiwweGZiLDB4YjUsMHhmZiwKKzB4ZWYsMHg3YywweGViLDB4MmIsMHg1MiwweDViLDB4M2IsMHhkYSwweGQ0LDB4ZjMsMHgzNiwweDk2LDB4YjUsMHhiZCwweGYxLDB4ZmIsCisweGRhLDB4ZWUsMHhmNiwweGZlLDB4ZDMsMHgzNSwweGJkLDB4ZGYsMHhhZCwweGNmLDB4ZWYsMHg3ZSwweGNkLDB4NmIsMHhiYiwweGRmLAorMHhmZiwweGZmLDB4ZmQsMHhiMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGQzLDB4NWYsMHhmNiwKKzB4ZmYsMHhmNiwweGZmLDB4ZmQsMHhhZCwweGZkLDB4ZmYsMHg3ZiwweGVmLDB4ZmYsMHg2ZiwweDdmLDB4ZGIsMHhmMSwweGE1LDB4YTMsCisweDdmLDB4NmYsMHg2YiwweDRmLDB4ZmYsMHhkYiwweGZiLDB4Y2IsMHhmZiwweGY2LDB4ZmYsMHhmNCwweGQ3LDB4ZmQsMHhiZiwweGZlLAorMHhkZiwweGZmLDB4ZDAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhkZiwweGZmLDB4ZmYsMHhmZiwKKzB4M2YsMHg3ZiwweGZjLDB4ZTUsMHhmZiwweDIwLDB4ZmUsMHhmZiwweGZmLDB4ZGYsMHg3ZiwweGZmLDB4ZjEsMHg3ZiwweGZmLDB4ZmUsCisweGZmLDB4ZjAsMHg3YywweDNkLDB4NGYsMHhmMywweGMzLDB4M2YsMHhmZiwweGZmLDB4NmYsMHhjMywweGZmLDB4MGYsMHhmZiwweGZmLAorMHhhZiwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmYiwweGI3LDB4ZTAsMHgwZiwweGZmLDB4ZmYsMHgyYiwKKzB4ZmYsMHg3ZCwweGJmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmOCwweDlmLDB4N2YsMHhmZiwweGYxLDB4NTUsMHhmZiwweGZmLDB4ZmYsCisweGZkLDB4N2MsMHgzYywweGZmLDB4ZjMsMHhjMywweDNmLDB4ZmYsMHhmZiwweGVmLDB4YzMsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLAorMHhmMCwweDlmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHhmZiwweDlmLDB4YmYsMHg3ZiwKKzB4ZjksMHgxOSwweDQ3LDB4OGUsMHhlNywweDlmLDB4M2YsMHgxNywweGZmLDB4ZmMsMHg4MSwweGMxLDB4N2UsMHhmMywweGQ5LDB4ZjksCisweDczLDB4ZGYsMHhmNCwweDdmLDB4ZmEsMHhmZiwweGZmLDB4ZmYsMHhmYiwweDdmLDB4NzcsMHhjNywweGZmLDB4ZmYsMHhmZiwweGYwLAorMHgyZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhmNywweGZmLDB4ZmIsMHhmZiwweGY3LDB4M2YsMHhmYywweGJmLDB4M2UsMHgzZiwKKzB4ZWMsMHhmZiwweDgxLDB4YWYsMHhmZSwweDRmLDB4ZjMsMHhiYiwweGZmLDB4ZjAsMHg3ZSwweGZmLDB4NmYsMHhmZiwweDg3LDB4ZmYsCisweGJiLDB4ZmYsMHhkNSwweGZjLDB4ZmYsMHg3ZiwweGZjLDB4NmYsMHhmZiwweGVmLDB4ZTcsMHhmZiwweGZmLDB4ZmEsMHhmMCwweDNmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYzLDB4YzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwKKzB4MDAsMHgzMCwweDEwLDB4NjAsMHgyMCwweDAwLDB4MDgsMHgwMCwweDAxLDB4MjAsMHg4MCwweDAwLDB4MTAsMHgwMCwweDA0LDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4ODAsMHg0MCwweDAwLDB4MDgsMHgyMCwweDNjLDB4ZjAsMHg2ZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmNSwweGJmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZlLDB4M2YsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHhmMSwweGRmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGRmLDB4ZmYsCisweGZkLDB4YmQsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg1YiwweGYwLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZjAsMHhiZiwweGJmLDB4YmYsMHhmZiwweGY3LDB4ZmIsMHhmZiwweGZlLDB4ZWUsMHhmYSwweGZmLDB4ZmYsMHhmZiwKKzB4M2QsMHgzYiwweGZmLDB4ZmYsMHhmZSwweGZiLDB4ZjEsMHhmZiwweGJmLDB4N2IsMHhmZiwweGZmLDB4ZWYsMHhmZiwweGJmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGY3LDB4ZWYsMHhmZiwweGZiLDB4ZDAsMHhmMCwweGRmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGY4LDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGIsMHgxMCwweDA1LDB4MDEsMHgwMCwweDA4LDB4MDAsMHgwMiwKKzB4MDEsMHgwMSwweDAwLDB4MDAsMHgxMCwweDAxLDB4YzgsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDIsMHgwMiwweDAwLDB4MDAsCisweDAwLDB4ODAsMHgwMiwweDAwLDB4MDAsMHg0MCwweDI0LDB4ODAsMHgwMCwweGMxLDB4ZjAsMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZmQsMHhmNywweGZhLDB4ZWYsMHhlZSwweGY5LDB4ZmQsMHhmZiwweGY3LDB4ZmUsMHhiZiwKKzB4MWYsMHhmZCwweDllLDB4ZmQsMHhkMSwweGVmLDB4ZmYsMHhmNywweDdmLDB4OWYsMHhmZiwweGVmLDB4ZmYsMHhmNiwweGZmLDB4ZmUsCisweGZlLDB4N2IsMHhmZiwweGJkLDB4ZmYsMHg3ZSwweGZmLDB4ZmYsMHhmZiwweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLAorMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmQsMHhmZiwweGZmLDB4ZGYsMHhmZiwKKzB4ZmYsMHg1ZiwweGYxLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhlZiwweGZmLAorMHhmNywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgzZiwweGZiLDB4ZmYsMHhmZiwweGVmLDB4ZmIsMHhmZCwKKzB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY3LDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweGZmLDB4ZTcsMHhmZiwKKzB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGNmLDB4ZmYsMHhmYiwweGZmLDB4ZmIsMHhmMSwKKzB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgyZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2IsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZjEsMHhmZiwKKzB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4NTcsMHhmZiwweGZlLDB4YmYsMHhmYiwweGYxLDB4ZmYsMHhmZiwKKzB4ZmQsMHhmNywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGQ3LDB4ZmYsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmNywweGRiLDB4ZmYsMHhkYiwweGZkLAorMHhmNiwweGZmLDB4ZjYsMHhmZiwweDNjLDB4YmMsMHhiYywweGJmLDB4ZGYsMHg2ZiwweGVmLDB4MmYsMHhmMSwweDNjLDB4YmYsMHhiYywKKzB4YmYsMHhkZiwweDZmLDB4ZmYsMHg2ZiwweGY3LDB4ZGIsMHhmZiwweGRiLDB4ZmQsMHhmNiwweGZmLDB4ZjYsMHhmZiwweGZmLDB4ZmYsCisweDAxLDB4ZTIsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby95YW05NjAwLmggYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW05NjAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkMWZlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbTk2MDAuaApAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqCisgKiBGaWxlIHlhbTExMS5tY3MgY29udmVydGVkIHRvIGggZm9ybWF0IGJ5IG1jczJoCisgKgorICogKEMpIEY2RkJCIDE5OTgKKyAqCisgKiBUdWUgQXVnIDI1IDIwOjIzOjAzIDE5OTgKKyAqCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYml0c185NjAwW109IHsKKzB4ZmYsMHhmMiwweDAwLDB4YTUsMHhhZCwweGZmLDB4ZmUsMHg5ZiwweGZmLDB4ZWYsMHhmYiwweGNiLDB4ZmYsMHhkYiwweGZlLDB4ZjIsCisweGZmLDB4ZjYsMHhmZiwweDljLDB4YmYsMHhmZCwweGJmLDB4ZWYsMHgyZSwweDNmLDB4NmYsMHhmMSwweGZkLDB4YjQsMHhmZCwweGJmLAorMHhmZiwweDZmLDB4ZmYsMHg2ZiwweGZmLDB4MGIsMHhmZiwweGRiLDB4ZmYsMHhmMiwweGZmLDB4ZjYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjAsMHg2ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhmZiwweGZmLDB4ZmYsCisweGZiLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweDdmLDB4ZjEsMHhmZiwweGZlLDB4ZmYsMHhiZiwweGJmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmMCwKKzB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsCisweGZmLDB4ZmYsMHhmNywweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4N2UsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhkZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZjMsMHhmYiwweGZlLDB4ZmYsMHhmMSwweGZmLDB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGYwLDB4N2YsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDBmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY1LAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgyZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHg3ZiwweGZmLDB4ZWYsCisweGZmLDB4ZWYsMHhmZiwweDdmLDB4ZWYsMHhmMSwweGZmLDB4ZWYsMHhmZiwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4OWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4YmQsMHhmZiwweGVmLDB4N2YsMHhlZiwweDdmLDB4ZmIsMHhkZiwweGQzLDB4NWEsMHhmZSwweGQ3LDB4ZDYsCisweGY3LDB4N2YsMHhiZCwweGYxLDB4YmIsMHg1ZCwweGQ2LDB4ZjcsMHhmZSwweDk2LDB4ZmYsMHhiZCwweGFmLDB4YWQsMHhiZiwweGVmLAorMHg3ZiwweDZiLDB4N2YsMHhmYiwweGQ2LDB4ZmUsMHhmNywweGZmLDB4MTAsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmUsMHhlZiwKKzB4ZmYsMHhmZiwweGRiLDB4ZmYsMHhmNiwweGZmLDB4ZjYsMHhmZiwweGZkLDB4YmYsMHhmZCwweGJmLDB4ZmYsMHg3ZiwweGZmLDB4N2YsCisweGRmLDB4ZGIsMHhmMSwweGZkLDB4MzUsMHhmZiwweDZmLDB4ZmYsMHg2ZiwweGZmLDB4ZGIsMHhmZiwweGNiLDB4ZmYsMHhmNiwweGZmLAorMHhmMiwweGZkLDB4ZmQsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg1NSwweGZmLDB4Y2MsMHhjMCwweDNmLDB4ZmYsCisweGZmLDB4ZjEsMHgyNCwweGYwLDB4ZmYsMHhmZiwweGNmLDB4ZWYsMHgzZiwweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmYywweDNmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4NTUsMHhmZiwweGNjLDB4YzAsMHgzZiwweGZmLDB4ZmYsCisweGYxLDB4MDAsMHhmMCwweGZmLDB4ZmYsMHhjZiwweGRmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmMsMHgzZiwweGZmLAorMHhmZiwweGZmLDB4N2QsMHhmZiwweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmUsMHg3ZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsCisweGZmLDB4Y2YsMHhmZiwweGYzLDB4ZmYsMHg5NywweGZmLDB4ZmYsMHg4ZiwweGU3LDB4ZmYsMHhmZiwweGZjLDB4NzEsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY1LDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZTMsMHhmNywweGVmLDB4ZmYsMHhmZiwweGZjLDB4N2IsMHhmZiwweGYxLDB4M2YsCisweGZmLDB4ZWYsMHhmZiwweGNmLDB4ZTMsMHhlMywweGZmLDB4ZmYsMHhmZiwweGZmLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhiZiwweGZmLAorMHhiZiwweGZmLDB4ZGEsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMiwweGMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMSwweDNjLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmQsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweDlmLDB4ZmYsCisweGZmLDB4ZmYsMHhmNywweGZmLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhkYiwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYwLDB4YmIsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZiLDB4ZGYsMHhiZiwweGYxLDB4ZmUsMHhmZCwweGY3LDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4NzcsMHhmZCwweGYyLAorMHhmMCwweDFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmOCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywKKzB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDkwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMSwweDAwLDB4MDAsMHgwNCwweDI0LDB4MDAsCisweDQwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDEsMHhjMCwweGYwLAorMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGJmLDB4ZmYsMHhmZiwweDZmLDB4ZmYsMHhkZiwweGZmLDB4ZDEsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmIsMHhmZiwweGZiLDB4ZWYsMHhmZiwweGZmLDB4ZWUsMHhmZiwweGZmLDB4N2YsMHhmMCwweGRmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg4ZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmNSwweGFkLDB4ZmYsMHg2OSwweDJhLDB4ZWQsMHg2YiwweGZiLDB4ZGYsMHgzYSwKKzB4ZGMsMHhmNCwweDk2LDB4ZWUsMHhiMywweDNkLDB4MzUsMHhjMSwweGJiLDB4ZGQsMHhmZSwweGY2LDB4ZmUsMHhkNiwweGI1LDB4YWQsCisweGJmLDB4YTUsMHhhZCwweDQ5LDB4MmYsMHg0ZiwweDJiLDB4ZGEsMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MmYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLDB4ZmIsMHg1YiwweGY3LDB4ZjYsMHhmZiwweGY2LDB4ZmYsMHhmZCwweGJmLDB4ZmQsMHhhNSwKKzB4ZjMsMHg2ZiwweGYzLDB4NmUsMHhmYSwweDdiLDB4ZDEsMHhmZCwweGI1LDB4NzcsMHg2ZiwweGU5LDB4NmYsMHhmZiwweGRiLDB4ZmIsCisweGRiLDB4ZGYsMHhmNiwweGZmLDB4ZjYsMHhmZiwweGZkLDB4M2YsMHhmZSwweGY3LDB4ZmYsMHhkMCwweDRmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGZmLDB4OWYsMHhmZiwweGZmLDB4MGYsMHhmZiwweGMwLDB4M2YsMHg5YywweDAzLDB4ZmYsMHhmZiwweDhiLDB4YTUsMHhmZSwKKzB4ODAsMHgzZSwweGMyLDB4YmYsMHhhYywweGIxLDB4MjQsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4YTMsCisweGZmLDB4ZmQsMHg2YiwweGZmLDB4ZmYsMHhmMCwweGE1LDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHhjMCwweDNmLDB4ZDQsMHg2YiwweGZmLDB4ZmYsMHhkYiwweGZmLDB4ZmUsMHg4NiwKKzB4YmYsMHhjMiwweGJmLDB4MzAsMHhhMSwweDI0LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhjYywweGZmLDB4MGYsMHhmZiwweGEzLDB4ZmYsCisweDA1LDB4NmIsMHhmZiwweGZmLDB4ZjAsMHhhNSwweGZmLDB4ZmYsMHhmZiwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLAorMHhmZiwweGZmLDB4ZmIsMHhjNywweGZmLDB4YzQsMHhmZiwweGZmLDB4N2YsMHhmZiwweGVjLDB4ZmUsMHg3ZiwweGRmLDB4ZDgsMHhiOSwKKzB4NDcsMHhmYywweDM2LDB4YzEsMHhkZiwweGZmLDB4ZmYsMHhmOSwweGZmLDB4ZjMsMHhmZiwweGY3LDB4ZmYsMHhmYywweGZmLDB4ZmQsCisweDNmLDB4ZmYsMHhmZiwweGZmLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNSwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHg3ZSwweGJkLDB4M2YsMHhmZiwweDJiLDB4ZmUsMHgyZiwweGY1LDB4YTMsMHhmYywKKzB4NWIsMHhmZSwweDYxLDB4OWYsMHg3ZiwweGVmLDB4ZmYsMHhmZiwweGE3LDB4ZmIsMHhmZiwweGZmLDB4ZmEsMHhmZSwweGZmLDB4MzMsCisweGYxLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZhLDB4ZjAsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjEsMHhjMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDMwLDB4MjQsMHgwNCwKKzB4MDAsMHgwMSwweDAwLDB4ODAsMHg0MCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAxLDB4MDEsMHgwMCwweDAyLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgzZCwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZkLDB4YmQsMHhmZiwweGZkLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGZmLDB4N2YsMHhmNiwweGVmLDB4YmYsMHhmNywweGZmLDB4NzMsMHhlYiwKKzB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmOSwweGZmLDB4ZmQsMHhmZSwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZDksMHhmMCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMCwweGJmLDB4N2YsMHhmZiwweGZmLAorMHhmZiwweDdmLDB4ZmYsMHhmZiwweGRlLDB4ZmYsMHhmZiwweGVmLDB4ZGQsMHhkZSwweDc3LDB4ZjIsMHhmYiwweGVkLDB4ZTcsMHhmMSwKKzB4NzMsMHhmZCwweGZkLDB4ZGYsMHhmZiwweDdkLDB4YmUsMHhkZiwweGZmLDB4ZmIsMHhmZiwweGVmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZjAsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjgsMHgzMCwweDIwLDB4MDIsMHgwMCwweDIyLAorMHg0MCwweGMwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAyLDB4NDEsMHgwMiwweDEyLDB4MDAsMHgyMSwweDg3LDB4ODEsMHgwMCwKKzB4MDAsMHg4MCwweDA0LDB4MGIsMHgyOCwweDAxLDB4YjAsMHgwMCwweDgyLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHhjMSwweGYwLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZCwweGZmLAorMHhmNywweGZmLDB4ZmUsMHg3ZiwweGVkLDB4NzksMHhmZiwweGRlLDB4ZWIsMHg3ZiwweDc0LDB4ZjcsMHhmNywweGUxLDB4ZjksMHhmZiwKKzB4ZjYsMHg1ZiwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZDcsMHhkYiwweGVmLDB4ZmYsMHhiYiwweGZmLDB4ZmYsMHhmZiwweGNjLDB4ZmYsCisweGZmLDB4ZmYsMHhmMCwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZjAsMHgwZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmQsMHgzZCwweGNkLDB4NDksMHg3ZiwweDZmLAorMHgyYiwweGJhLDB4NWMsMHhkMiwweGRhLDB4ZjYsMHhmMywweDNlLDB4ZjcsMHhmZiwweGJkLDB4ZjEsMHhmYSwweGRmLDB4ZmUsMHhmNywKKzB4Y2MsMHhmNiwweGJiLDB4YTUsMHhiMywweGFkLDB4YmYsMHg2ZiwweDdkLDB4NmYsMHg2YiwweGRiLDB4ZGYsMHhiZCwweGZmLDB4ZmUsCisweGIwLDB4NWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmZiwweGZiLDB4ZGIsMHg1NywweGY2LDB4ZmUsMHg5ZiwweGQ1LAorMHhiNywweGZmLDB4YWYsMHhlNSwweDNmLDB4ZmYsMHhmZiwweDZmLDB4ZmYsMHhkYiwweGYxLDB4ZmQsMHhiZiwweGZmLDB4NmYsMHg2OSwKKzB4NmMsMHhkZiwweGRhLDB4ZGYsMHhjYiwweGZmLDB4ZjYsMHhmZiwweDc2LDB4ZmQsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZDAsCisweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLDB4YmQsMHgwOCwweDAzLDB4ODksMHg0ZiwweDVhLAorMHgwZiwweGYwLDB4ZmYsMHhmOCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweDVhLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMywKKzB4ZmEsMHhhMCwweGYwLDB4ZjIsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYywweGZkLDB4MDAsMHg2YiwweGZmLDB4ZmYsMHg1YSwweDBmLAorMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHg1YSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YjMsMHhmNSwKKzB4NTAsMHhmMCwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZDcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDdmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZkLDB4YmMsMHhmZiwweGU0LDB4ZTcsMHg3MSwweGZmLDB4ZjksMHhjNCwweGY0LAorMHg3ZiwweDdmLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmNywweDczLDB4YmYsMHgxNCwKKzB4ZmYsMHhlNiwweGZmLDB4ZmYsMHhlMSwweDdkLDB4ZmYsMHhmZiwweGU3LDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgzZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhmNSwweGZmLDB4ZmYsMHhmZSwweGQyLDB4ZmEsMHhmZiwweGM0LDB4ZjQsMHg1YywweGJmLDB4ZmEsMHhmZiwweGZmLAorMHhlYywweDdlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHg2YiwweGRiLDB4ZmYsMHhkZiwKKzB4ZjksMHhmYiwweGJmLDB4ZmYsMHhmMSwweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGYwLDB4YmYsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4ZjMsMHhjMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDA4LDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDEsMHgwMCwweDAxLDB4MDAsMHgwMCwweDgwLDB4MDIsMHgwMCwweDAxLDB4M2MsMHhmMCwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGZkLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweGRmLDB4ZmYsMHhlZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmYiwweGZmLDB4ZmQsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGMzLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjAsCisweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZjcsMHgyMywweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZWYsMHhmZiwweGZlLDB4N2YsMHg3ZCwweGY3LAorMHhmZSwweGZmLDB4N2YsMHg3MSwweGZmLDB4ZmIsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweDZlLDB4ZmQsMHhmNywweGZkLDB4ZmYsMHhiZiwKKzB4ZmYsMHhiZiwweGY5LDB4ZmQsMHhmZiwweGRmLDB4ZWYsMHhmMCwweGYwLDB4YWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY4LDB4MzAsCisweDQwLDB4MDEsMHgwMCwweDgzLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwNiwweDA4LDB4MDQsMHgyNiwweDI2LDB4MDAsMHgwMCwweDA2LAorMHgwMywweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHg3MCwweDA4LDB4ODAsMHgwMCwweDIwLDB4MDEsMHgyMCwKKzB4MDAsMHgwMiwweDAwLDB4MzAsMHgwMCwweDAwLDB4YzEsMHhmMCwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHg3YiwweDNmLDB4ZjcsMHhmZiwweGQ3LDB4ZmUsMHhmZSwweGZiLDB4ZmUsMHgzYiwweGZlLDB4YmQsMHhmZiwweDJmLAorMHhmZiwweDcxLDB4ZmYsMHhmYiwweDdmLDB4ZTcsMHhmZiwweGY5LDB4ZWYsMHhmZiwweGQ3LDB4ZmEsMHhmZiwweGI3LDB4YmIsMHhmZSwKKzB4ZmYsMHhmZiwweDc0LDB4ZmYsMHhmNywweGZmLDB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4OGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YjUsCisweGJkLDB4NmYsMHg3YywweGViLDB4N2YsMHhmYiwweGRiLDB4ZDMsMHg0YiwweGVlLDB4ZDYsMHhmNiwweGI3LDB4ZmQsMHhhYywweGExLAorMHhmYiwweGRmLDB4ZmUsMHhmNywweGY0LDB4OTYsMHhiZCwweGI0LDB4YzUsMHhhNSwweGFmLDB4NmYsMHg2OSwweDRmLDB4N2YsMHhiYSwKKzB4ZGIsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZmYsCisweGY2LDB4ZmYsMHhmNiwweGZmLDB4YmQsMHhiZiwweGE1LDB4YmYsMHhmZiwweDdkLDB4N2YsMHhlZiwweGZmLDB4ZmIsMHhmMSwweGZkLAorMHhiZiwweGZmLDB4NmYsMHhmZiwweDZiLDB4N2EsMHhkYiwweGZmLDB4ZGIsMHhkZiwweGY2LDB4ZmUsMHhiNiwweGZkLDB4ZmQsMHhiZiwKKzB4ZmUsMHhmNywweGZmLDB4ZDAsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNCwweDJmLDB4ZmYsCisweGZjLDB4NDMsMHg2YiwweGZmLDB4ZmYsMHhmZiwweDBkLDB4ZmYsMHhmYywweDMzLDB4M2YsMHhmMCwweDVmLDB4ZjEsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZjksMHhkZSwweGYwLDB4NGMsMHhmZSwweDc3LDB4YWYsMHhmZiwweGZmLDB4ZWYsMHhmZiwweGYwLDB4ZmYsMHhkYiwKKzB4ZmYsMHg1ZiwweGYwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmUsMHhmNywweGZmLDB4ZjAsMHgyZiwweGZmLDB4ZmQsCisweDQzLDB4N2YsMHhmZiwweGZmLDB4ZjEsMHgwZiwweGZmLDB4ZmMsMHgzMywweDNmLDB4ZmYsMHhhZiwweGYxLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGY2LDB4ZDcsMHhmZiwweGJjLDB4ZmQsMHhiZCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZjLDB4ZmYsMHhmZiwweGZiLDB4ZjEsCisweGJmLDB4ZmYsMHhmOSwweGZkLDB4Y2YsMHhmMiwweDcwLDB4ZmYsMHgxZiwweDlmLDB4ZjMsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmYywweGY3LDB4ZmYsMHgxMywweDlmLDB4ZmMsMHhmZiwweGZmLDB4ODQsMHhmNywweGZmLDB4ZmYsMHg0NywweGZmLDB4ZmYsMHhmZiwKKzB4ZjAsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZjLDB4ZmYsMHhmZSwweGZlLDB4NzksCisweDNmLDB4ZmYsMHgxZCwweDQ2LDB4Y2YsMHhmZiwweGNmLDB4ZmMsMHg3YiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGVkLAorMHhmMywweGFiLDB4ZmYsMHhjYiwweGZmLDB4ZjgsMHhmZiwweGZjLDB4ZjUsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmEsMHhmMCwKKzB4OGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYzLDB4YzIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsCisweDAwLDB4MDAsMHgyMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDQsMHgwOCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDIwLAorMHgwYywweDAwLDB4MDAsMHgwNCwweDAxLDB4MDAsMHgwMSwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMSwweDNjLDB4ZjAsMHg3ZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZkLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsCisweGRmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGViLAorMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZiLDB4ZjcsMHg3ZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4YmYsMHhkYiwweGYwLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGY3LDB4ZmYsCisweGJmLDB4YmYsMHhjZiwweGZmLDB4ZmYsMHhmZiwweDNlLDB4ZjEsMHg3ZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZkLDB4ZmYsMHhiZiwweGJkLDB4ZmUsMHhmZiwweGZiLDB4ZjcsMHhkZiwweGZiLDB4ZDAsMHhmMCwweDlmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGY4LDB4MzAsMHgyMCwweDAwLDB4NDAsMHgwMSwweDgwLDB4YzAsMHgzMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MTAsCisweDUwLDB4ODgsMHgyMCwweDAwLDB4MDAsMHgxMywweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDEsMHg4MCwweDA4LDB4MDAsMHgwMCwweGEwLDB4MDAsMHgxMCwweGMxLDB4ZjAsMHhlZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmZCwweGVmLDB4N2YsMHhmZiwweGZmLDB4YmYsMHhmZiwweGY3LDB4ZmYsMHhlZiwweGZiLDB4ZmQsMHg3NywweGVmLDB4YmYsCisweGY3LDB4N2YsMHhmZiwweGZmLDB4YmYsMHhkMSwweDdmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhhZiwweGZmLAorMHhkZiwweGY3LDB4ZmIsMHhmZiwweGZkLDB4ZmYsMHhmYywweGZmLDB4ZmQsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZGQsMHhmZiwKKzB4ZmYsMHhmZiwweGE1LDB4ZmQsMHg2ZiwweDdkLDB4NmQsMHg3ZiwweDUyLDB4ZGYsMHg1YSwweDRiLDB4ZWUsMHhiNiwweGVlLDB4ZjIsCisweGJiLDB4YWMsMHhhMSwweDViLDB4NGQsMHhkNiwweGY3LDB4ZmUsMHhiMiwweGJkLDB4MzUsMHhiNSwweGI1LDB4ZGQsMHg2ZiwweDdmLAorMHhlOSwweDVmLDB4NTIsMHhkZiwweGJkLDB4ZmYsMHhmZiwweGYwLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhkYiwweGZlLDB4ZjYsMHhmZiwweGY2LDB4ZmYsMHhmZCwweGJmLDB4ZmQsMHhiNSwweGJmLDB4ZjksMHg3ZiwweDZmLDB4ZmYsCisweGRiLDB4ZjEsMHhmZCwweGJmLDB4ZmYsMHg2ZiwweGZmLDB4NjksMHg3ZiwweGRiLDB4ZmYsMHhkMywweGZmLDB4ZjYsMHhmZSwweGYyLAorMHhmZiwweGFkLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkMCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmNSwKKzB4MzAsMHgwZiwweGZmLDB4ZmYsMHhmZCwweDZiLDB4Y2EsMHhmZiwweGYwLDB4MGYsMHhkNiwweGJmLDB4Y2YsMHgzZiwweGZmLDB4ZmYsCisweGYxLDB4ZmYsMHhmZiwweGZmLDB4Y2EsMHhmZSwweGJmLDB4ZmYsMHhmMCwweDA1LDB4YWYsMHgwZiwweGZmLDB4ZmMsMHhmMCwweGNmLAorMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjUsMHgzMCwKKzB4MGYsMHhmZiwweGZmLDB4ZmMsMHgzZiwweGNhLDB4ZmYsMHgwZiwweDBmLDB4ZDYsMHhiZiwweGZmLDB4ZmYsMHhmNSwweDVmLDB4ZjEsCisweGZmLDB4OGIsMHhmZiwweGMzLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweGZjLDB4ZjAsMHhjZiwweGYwLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4Y2YsMHhmZiwKKzB4ZmYsMHhiZiwweDlmLDB4M2YsMHhmZSwweGZjLDB4ZmYsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGYxLDB4ZmYsCisweGRmLDB4ZmUsMHg3ZSwweDNmLDB4OWYsMHhmNCwweGZjLDB4N2YsMHhmYywweGZmLDB4ZmYsMHgzZiwweGZmLDB4M2YsMHhmZSwweDNmLAorMHhmZiwweGZmLDB4ZmYsMHhmMCwweDRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNSwweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmUsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4YmYsMHhmYiwweGZmLDB4ZjgsMHhlZCwweGZmLDB4OGYsMHhmZiwweGJiLDB4ZmYsMHhiMSwweGYzLDB4ZWYsCisweDhmLDB4ZjcsMHhmZiwweGZmLDB4ZGIsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGJmLDB4ZmQsMHg3OSwweGJmLDB4YmYsMHhmZiwweGZmLAorMHhmZiwweGZiLDB4ZjAsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjMsMHhjMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDQsMHgwOCwweDA4LDB4MDEsMHgwMSwweDAwLDB4OTAsCisweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAxLAorMHgzYywweGYwLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZkLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg5ZiwweGZmLDB4YWYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGJmLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhlZCwweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGMzLAorMHhmMCwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMCwweGZmLDB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGZmLDB4YmIsMHhmZiwKKzB4ZmYsMHhmZiwweDdmLDB4ZjYsMHhmZiwweDdmLDB4ZmIsMHhmZCwweGVkLDB4ZmYsMHhmMSwweGZmLDB4ZmUsMHg3ZiwweGZmLDB4ZmYsCisweGZmLDB4NWYsMHhmZiwweGY3LDB4ZmYsMHg3ZSwweGZmLDB4ZmQsMHhmZiwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmMCwweGYwLAorMHg4ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjgsMHgzMCwweDgwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHg0MCwweDAyLDB4MDAsMHgwMywKKzB4MDAsMHgwNSwweDA0LDB4MjAsMHgwMCwweDAwLDB4MDEsMHhkMCwweDAwLDB4ODEsMHgwMCwweDIwLDB4MDQsMHgwNCwweDAwLDB4MDAsCisweDgxLDB4MDQsMHgwOCwweDgwLDB4MTAsMHgwMCwweGMwLDB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDA4LDB4YzEsMHhmMCwweDZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjMsMHhmZCwweGZmLDB4ZWQsMHhmYywKKzB4ZmYsMHhmZiwweDlmLDB4ZmIsMHhmZCwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweDdmLDB4ZmIsMHgzZSwweGZmLDB4OWYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmQsMHhmOSwweGZmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg2ZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4Y2YsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmQsMHhiZCwweGZmLDB4ZWYsMHg3YywweGViLDB4N2YsMHhmYiwweGRiLDB4ZmEsMHhkYywKKzB4ZWUsMHhmNywweGY2LDB4ZDcsMHhmNSwweDJkLDB4YTEsMHhiYiwweGRkLDB4ZWUsMHhmNywweDU0LDB4ZjcsMHhmYiwweDJjLDB4YjUsCisweGI0LDB4YmQsMHg2YiwweDZmLDB4ZWYsMHg2ZiwweGJiLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDFmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGY2LDB4ZmYsMHhmNiwweGZmLDB4ZmQsMHhiZiwweGZmLDB4YmYsMHhlZiwKKzB4NmYsMHhmZiwweDZmLDB4ZmEsMHhkYiwweGYxLDB4YzUsMHhiZCwweGY1LDB4NmYsMHhmZiwweDZmLDB4Y2EsMHhkYiwweGZmLDB4ZGIsCisweGZiLDB4ZjYsMHg5NywweGY2LDB4ZmYsMHhmZCwweGJmLDB4ZmUsMHhmNywweGZmLDB4ZDAsMHg5ZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4OGIsMHg3ZiwweGZmLDB4ZmYsMHhlNywweDYzLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmYywweDc3LDB4ZGYsMHhmMSwweGRiLDB4ZmYsMHhkNiwweGE4LDB4M2YsMHhmZiwweGZmLDB4MDgsMHgyZiwweGYwLDB4ZmYsCisweGMzLDB4ZmYsMHhlYiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg1ZiwweGYwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDhiLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmMsMHhmZiwweGNmLDB4ZjEsMHhkYiwweGZmLDB4ZDYsMHhhOCwweDNmLDB4ZmYsMHhmZiwweDA4LDB4MmYsMHhmMCwweGZmLDB4YzMsCisweGZmLDB4ZWIsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNSwweGJmLDB4ZmYsMHhjYSwweGZmLDB4OWYsMHhmZiwweGZhLDB4YjksMHhlNywKKzB4OWYsMHhmMywweDgxLDB4ZmYsMHhmZiwweGZjLDB4NzMsMHhkNywweGZmLDB4ZmYsMHg3NywweGZmLDB4ZmQsMHhmZiwweGZjLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhmZiwweGZmLAorMHhmZiwweGY3LDB4ZGUsMHhmZiwweGZlLDB4N2UsMHhmZiwweGJmLDB4ZmYsMHhiZiwweGYxLDB4YjMsMHhmZiwweGZmLDB4ZTMsMHhmYiwKKzB4ZmYsMHhlMSwweDFmLDB4N2YsMHhmZiwweGY4LDB4NzgsMHhmZiwweGZiLDB4MWUsMHhmZiwweGY3LDB4ZmUsMHhlNywweGZmLDB4ZmYsCisweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmYSwweGYwLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYzLDB4YzAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwKKzB4MDEsMHg4MCwweDQwLDB4NDAsMHgyMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsCisweDgwLDB4MDAsMHgwMCwweDAxLDB4M2MsMHhmMCwweGFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZCwweGJmLDB4ZmYsMHhmYiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZjcsMHhmMSwKKzB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZjAsMHg4ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjAsMHhmZiwweGRmLDB4ZmYsMHhmZiwweDdmLAorMHhmZiwweGZmLDB4ZmYsMHhiZSwweGQ3LDB4ZmYsMHhlZCwweGJkLDB4N2UsMHhiZiwweGZlLDB4ZjYsMHg3ZiwweGJmLDB4NzEsMHhmZiwKKzB4ZmYsMHhkYSwweGZmLDB4ZjksMHhmZiwweGJmLDB4N2YsMHhmZSwweGZmLDB4NmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweDdmLDB4ZmYsMHhkMCwweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY4LDB4MzAsMHg0MiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4MCwweGMxLDB4MDAsMHgwMCwweDkwLDB4MDAsMHhjNCwweDAwLDB4MDAsMHgxMiwweDIwLDB4NDMsMHgyMiwweDgxLDB4ODQsMHgwMCwKKzB4MDAsMHgxNCwweDAwLDB4MDEsMHgwMCwweDA4LDB4ODAsMHgwMCwweDAyLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMiwweDAwLDB4MDAsCisweDEwLDB4YzEsMHhmMCwweDFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmQsMHhmZiwweGZmLDB4ZGQsMHhmZSwweGZmLAorMHhiNiwweDc2LDB4ZTUsMHhiYywweGY5LDB4ZjcsMHhhZiwweDVmLDB4YmYsMHhmYywweGRmLDB4Y2YsMHhmMSwweGZmLDB4ZWYsMHg3OSwKKzB4ZmYsMHhiZCwweGZmLDB4ZWYsMHhmZiwweGZmLDB4ZjcsMHg2ZiwweDVmLDB4ZmYsMHhmZiwweGZkLDB4ZWYsMHhlZiwweGJmLDB4ZmYsCisweGZmLDB4ZjAsMHg5ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGRiLDB4ZmYsMHhmZiwweGZkLDB4MmQsMHhmZiwweDY5LDB4MmEsMHhlZiwweDc3LAorMHhiYiwweGRkLDB4NWEsMHhkZiwweGY2LDB4ZjYsMHhkNiwweGY3LDB4N2QsMHhiZCwweGQxLDB4YjIsMHg0YSwweGQ2LDB4YjIsMHhiZSwKKzB4OTcsMHhmNSwweGJkLDB4YjMsMHhhZCwweGZmLDB4ZWYsMHg3ZiwweDY5LDB4NmIsMHhmYiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsCisweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZmYsMHhmNiwweGZlLDB4OWYsMHhkNCwweGJmLAorMHhlZCwweGFmLDB4ZmYsMHg2YiwweDZmLDB4ZjcsMHhmZiwweGRkLDB4ZGIsMHgzMSwweGZkLDB4YmYsMHhmZiwweDZmLDB4N2YsMHhmZiwKKzB4ZmYsMHhkYiwweGZmLDB4Y2IsMHhkZiwweGY2LDB4ZmYsMHhmNiwweGZmLDB4ZmQsMHhiZiwweGZlLDB4ZjcsMHhmZiwweGQwLDB4OGYsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmQsMHgxZiwweGZmLDB4NDYsMHgyZiwweDlmLDB4ZmYsMHhmZiwweGZmLAorMHhhNSwweGZmLDB4ZmYsMHhmZiwweGRmLDB4YjcsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmNywweGU5LDB4NmEsMHhiZiwKKzB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZkLDB4NTUsMHg1NywweGZmLDB4ZmYsMHhmZiwweGZmLDB4YWYsMHhmMCwweDRmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGZlLDB4ZGYsMHhmZiwweGZkLDB4MWYsMHhmZiwweDQ2LDB4MmYsMHg5ZiwweGZmLDB4ZmYsMHhmZiwweGE1LAorMHhmZiwweGZmLDB4ZmYsMHhjMCwweDM3LDB4ZmYsMHhmZiwweGYxLDB4OTksMHg4ZSwweGRjLDB4N2YsMHhlOSwweDZhLDB4YmYsMHhmZiwKKzB4ZjAsMHgwZiwweGZmLDB4ZmYsMHhmZCwweDU1LDB4NTcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgwZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsMHhjMCwweGJlLDB4ZmYsMHhmZiwweGNmLDB4ZWYsMHg5ZiwweGZmLAorMHhmZiwweGZiLDB4ZmYsMHhlNywweGZmLDB4ZmYsMHhhMSwweGUzLDB4Y2UsMHgzYywweDU4LDB4M2YsMHhmMywweGZmLDB4ZmQsMHhlZiwKKzB4ZjksMHhmZiwweGZmLDB4ZjcsMHhmMSwweDdmLDB4ZmYsMHhjYiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4ZjUsMHg3ZiwweGZmLDB4ZjAsMHhmZiwweGZlLDB4ZmYsMHhjNCwweDc1LDB4ZTcsMHhiOSwweGZmLDB4ZmYsMHhmZiwweGVmLAorMHhmZiwweGM3LDB4MzcsMHgzYiwweGZmLDB4ZjAsMHgxMywweDllLDB4MGYsMHhmNCwweGZmLDB4ZmUsMHhmYiwweGZmLDB4ZmYsMHhmOSwKKzB4ZmMsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmEsMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGYzLDB4YzAsMHgwMSwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDIsMHgyMiwweDAwLDB4MDAsMHhjMCwweDQwLDB4MDAsMHg0MCwweDAwLAorMHgwNCwweDA4LDB4MDQsMHgwYSwweDAxLDB4MDEsMHgxMCwweDIwLDB4MjAsMHgwMCwweDAwLDB4MDQsMHgwOCwweDA4LDB4MDQsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMSwweDNjLDB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmQsCisweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweDdmLDB4ZmYsMHg3ZiwweGZmLDB4Y2YsMHg5ZCwweGZmLAorMHhmZiwweGY3LDB4ZmQsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGVlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGYwLDB4NmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYwLDB4ZmYsCisweGZmLDB4ZmYsMHhmNywweGY3LDB4ZmYsMHhmZiwweGZlLDB4YmYsMHhmNywweGZmLDB4ZmYsMHg1YiwweGZmLDB4YmYsMHhmNywweGZmLAorMHhmZCwweDdmLDB4NzEsMHhmZCwweGZmLDB4ZWQsMHhmNywweGZlLDB4ZWYsMHhmZiwweGZmLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGVmLDB4ZmYsMHg3ZiwweGZmLDB4ZDAsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmOCwweDMwLDB4MTEsCisweDAwLDB4NDgsMHg2MCwweDQwLDB4ODIsMHg2MCwweDI0LDB4NjAsMHgwMCwweGNjLDB4MDAsMHg4MCwweDA0LDB4MDEsMHgwMCwweDAwLAorMHgxNCwweDAxLDB4MGMsMHgwNCwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDA4LDB4MDAsMHgwMSwweDAwLDB4YzIsMHgwMCwKKzB4MDAsMHgwMiwweDAwLDB4ODAsMHgwMCwweGMxLDB4ZjAsMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGY3LDB4N2IsMHhmZiwweGYzLDB4ZWIsMHhiZiwweGZmLDB4ZjcsMHhmZiwweGZmLDB4ZmYsMHhlNywweDVkLDB4M2YsMHhmZiwweGY2LAorMHhkMSwweGZkLDB4ZmYsMHhlYiwweGY3LDB4M2QsMHhmZiwweGZmLDB4ZmYsMHg1ZiwweGZmLDB4N2YsMHg3ZiwweGYzLDB4ZmYsMHhmZiwKKzB4ZWYsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGYwLDB4NWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmNSwweGI1LDB4ZGYsCisweDZmLDB4N2QsMHg2OSwweDdmLDB4ZmIsMHhkZiwweDUyLDB4NWYsMHhmNiwweGY3LDB4ZmUsMHhmNiwweGYzLDB4YmQsMHhiMSwweGRhLAorMHhjZCwweGZlLDB4ZjYsMHhlZSwweGQyLDB4YmQsMHhhNSwweGFmLDB4YmQsMHhmZiwweDZmLDB4N2MsMHhlYiwweDJiLDB4ZmEsMHhkYSwKKzB4ZmYsMHhmZSwweGRmLDB4ZjAsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGZmLDB4ZjYsCisweGZmLDB4ZjYsMHhmZiwweGJkLDB4YmYsMHhjZCwweGJmLDB4ZWIsMHg2ZiwweGY3LDB4NmYsMHhkZiwweGRiLDB4NTEsMHhmZCwweGJkLAorMHhmZiwweDZmLDB4ZmYsMHg2ZiwweGZiLDB4NWIsMHhmZiwweGRiLDB4ZmYsMHhmNiwweGZlLDB4ZjYsMHhmZCwweGZkLDB4YmYsMHhmZSwKKzB4ZjcsMHhmZiwweGQwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZhLDB4NTAsMHhmZiwweGZmLDB4ZmYsCisweGYwLDB4NmYsMHhmZiwweGZmLDB4ZjAsMHg5NiwweGZmLDB4ZmYsMHhjNiwweDJiLDB4ZmYsMHhmZiwweGYxLDB4ZmMsMHhmZiwweGZmLAorMHhmNywweGRiLDB4YzMsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGMxLDB4NGYsMHhjMywweGZmLDB4ZmYsMHhmZiwKKzB4YWYsMHhmMCwweDlmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmNSwweGEwLDB4ZmYsMHhmZiwweGZmLDB4ZjAsCisweDZmLDB4ZmYsMHhmZiwweGYwLDB4OTYsMHhmZiwweGZmLDB4YzYsMHgyYiwweGZmLDB4ZmYsMHhmMSwweDVhLDB4ZmYsMHhmZiwweGZmLAorMHhmMywweGMzLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhjMSwweDRmLDB4YzMsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYywweGZmLDB4ZmYsMHg5ZiwweGYwLDB4N2YsCisweGZmLDB4ZjksMHhmYywweDRmLDB4ZjMsMHhmZiwweDI3LDB4ZWIsMHhmZiwweGZjLDB4ODEsMHhmYywweDdmLDB4ZmUsMHg3YiwweGZmLAorMHhmNywweGZmLDB4MTIsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwKKzB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY1LDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZSwweGZmLDB4ZmMsMHg3ZSwweDdmLDB4YmYsCisweGZmLDB4ZmYsMHhhZiwweGVmLDB4ZmYsMHhkZiwweGRmLDB4ZmIsMHhmZiwweGYxLDB4YzMsMHhmZSwweDZmLDB4ZjEsMHhjZiwweDNmLAorMHhmYiwweGZmLDB4ZmYsMHhjZiwweGZlLDB4ZmYsMHhmZiwweGZlLDB4N2YsMHhiZiwweGZmLDB4ZmYsMHhiZiwweGZhLDB4ZjAsMHhkZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMywweGMwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsCisweDIwLDB4MDAsMHgwMSwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDIsMHg4MCwweDAwLDB4MDIsMHgzYywweGYwLDB4MmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZmQsMHhiZiwweGZmLDB4ZmIsMHhmZCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY1LDB4ZjEsMHhmZiwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGIsMHhmMCwweDJmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGJmLDB4ZmIsCisweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZjcsMHhmZiwweGYxLDB4ZjcsMHhiZiwweGZiLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhkZSwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZWQsMHhmNywweGZmLDB4ZmYsMHg3ZiwweGQwLDB4ZjAsMHgzZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmOCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZTAsMHgwMCwweDAwLDB4ODAsCisweDIwLDB4MDEsMHgwMSwweDkyLDB4MDAsMHgwMSwweDAxLDB4MDAsMHhlMCwweDFjLDB4NjAsMHgyMCwweDMwLDB4MDgsMHgwOCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHhjMSwweGYwLDB4NmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZmUsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZjLDB4N2YsMHhmYiwweGJmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmNiwweGZmLDB4ZjcsMHg3ZSwweDNmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGY3LAorMHhmZiwweGZmLDB4ZmYsMHhlZCwweGZmLDB4ZGYsMHhmZiwweGI3LDB4ZmYsMHhmMCwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhiZiwweGZmLDB4ZGYsCisweDU3LDB4ZWYsMHhmMSwweGZkLDB4ZmUsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmYiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGRmLDB4ZmYsCisweGZmLDB4ZjEsMHhmZCwweGZmLDB4N2YsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDlmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNywweGZkLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg2ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsCisweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZiLDB4NmYsMHhmZiwweGZlLDB4YmYsMHhmZiwweGYxLDB4ZmYsCisweGY3LDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLAorMHhmZiwweGZmLDB4ZmYsMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmIsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweDU3LDB4ZmYsMHhmZCwweGJmLDB4ZmYsMHhmMSwweGZmLDB4ZWYsCisweGZlLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLAorMHhkZSwweGZmLDB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhkYiwweGZmLDB4ZGIsMHhmZCwKKzB4ZjYsMHhmZiwweGY2LDB4ZmYsMHgzYywweGJjLDB4YmMsMHhiZiwweGRmLDB4NmYsMHhlNywweDJmLDB4ZjEsMHgzYywweGJmLDB4ZmQsCisweGJmLDB4ZGYsMHg2ZiwweGZmLDB4NmYsMHhmNywweGRiLDB4ZmYsMHhkYiwweGZkLDB4ZjYsMHhmZiwweGY2LDB4ZmYsMHhmZiwweGZmLAorMHgwMiwweDAxLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vejg1MzAuaCBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3o4NTMwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlZjU0OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3o4NTMwLmgKQEAgLTAsMCArMSwyNDUgQEAKKworLyogODUzMCBTZXJpYWwgQ29tbXVuaWNhdGlvbnMgQ29udHJvbGxlciBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZQlGTEFHCTB4N2UKKworLyogV3JpdGUgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlSMAkwCQkvKiBSZWdpc3RlciBzZWxlY3RzICovCisjZGVmaW5lCVIxCTEKKyNkZWZpbmUJUjIJMgorI2RlZmluZQlSMwkzCisjZGVmaW5lCVI0CTQKKyNkZWZpbmUJUjUJNQorI2RlZmluZQlSNgk2CisjZGVmaW5lCVI3CTcKKyNkZWZpbmUJUjgJOAorI2RlZmluZQlSOQk5CisjZGVmaW5lCVIxMAkxMAorI2RlZmluZQlSMTEJMTEKKyNkZWZpbmUJUjEyCTEyCisjZGVmaW5lCVIxMwkxMworI2RlZmluZQlSMTQJMTQKKyNkZWZpbmUJUjE1CTE1CisKKyNkZWZpbmUJTlVMTENPREUJMAkvKiBOdWxsIENvZGUgKi8KKyNkZWZpbmUJUE9JTlRfSElHSAkweDgJLyogU2VsZWN0IHVwcGVyIGhhbGYgb2YgcmVnaXN0ZXJzICovCisjZGVmaW5lCVJFU19FWFRfSU5UCTB4MTAJLyogUmVzZXQgRXh0LiBTdGF0dXMgSW50ZXJydXB0cyAqLworI2RlZmluZQlTRU5EX0FCT1JUCTB4MTgJLyogSERMQyBBYm9ydCAqLworI2RlZmluZQlSRVNfUnhJTlRfRkMJMHgyMAkvKiBSZXNldCBSeElOVCBvbiBGaXJzdCBDaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUkVTX1R4X1AJMHgyOAkvKiBSZXNldCBUeElOVCBQZW5kaW5nICovCisjZGVmaW5lCUVSUl9SRVMJCTB4MzAJLyogRXJyb3IgUmVzZXQgKi8KKyNkZWZpbmUJUkVTX0hfSVVTCTB4MzgJLyogUmVzZXQgaGlnaGVzdCBJVVMgKi8KKworI2RlZmluZQlSRVNfUnhfQ1JDCTB4NDAJLyogUmVzZXQgUnggQ1JDIENoZWNrZXIgKi8KKyNkZWZpbmUJUkVTX1R4X0NSQwkweDgwCS8qIFJlc2V0IFR4IENSQyBDaGVja2VyICovCisjZGVmaW5lCVJFU19FT01fTAkweEMwCS8qIFJlc2V0IEVPTSBsYXRjaCAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxICovCisKKyNkZWZpbmUJRVhUX0lOVF9FTkFCCTB4MQkvKiBFeHQgSW50IEVuYWJsZSAqLworI2RlZmluZQlUeElOVF9FTkFCCTB4MgkvKiBUeCBJbnQgRW5hYmxlICovCisjZGVmaW5lCVBBUl9TUEVDCTB4NAkvKiBQYXJpdHkgaXMgc3BlY2lhbCBjb25kaXRpb24gKi8KKworI2RlZmluZQlSeElOVF9ESVNBQgkwCS8qIFJ4IEludCBEaXNhYmxlICovCisjZGVmaW5lCVJ4SU5UX0ZDRVJSCTB4OAkvKiBSeCBJbnQgb24gRmlyc3QgQ2hhcmFjdGVyIE9ubHkgb3IgRXJyb3IgKi8KKyNkZWZpbmUJSU5UX0FMTF9SeAkweDEwCS8qIEludCBvbiBhbGwgUnggQ2hhcmFjdGVycyBvciBlcnJvciAqLworI2RlZmluZQlJTlRfRVJSX1J4CTB4MTgJLyogSW50IG9uIGVycm9yIG9ubHkgKi8KKworI2RlZmluZQlXVF9SRFlfUlQJMHgyMAkvKiBXYWl0L1JlYWR5IG9uIFIvVCAqLworI2RlZmluZQlXVF9GTl9SRFlGTgkweDQwCS8qIFdhaXQvRk4vUmVhZHkgRk4gKi8KKyNkZWZpbmUJV1RfUkRZX0VOQUIJMHg4MAkvKiBXYWl0L1JlYWR5IEVuYWJsZSAqLworCisvKiBXcml0ZSBSZWdpc3RlciAjMiAoSW50ZXJydXB0IFZlY3RvcikgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMyAqLworCisjZGVmaW5lCVJ4RU5BQkxFCTB4MQkvKiBSeCBFbmFibGUgKi8KKyNkZWZpbmUJU1lOQ19MX0lOSAkweDIJLyogU3luYyBDaGFyYWN0ZXIgTG9hZCBJbmhpYml0ICovCisjZGVmaW5lCUFERF9TTQkJMHg0CS8qIEFkZHJlc3MgU2VhcmNoIE1vZGUgKFNETEMpICovCisjZGVmaW5lCVJ4Q1JDX0VOQUIJMHg4CS8qIFJ4IENSQyBFbmFibGUgKi8KKyNkZWZpbmUJRU5UX0hNCQkweDEwCS8qIEVudGVyIEh1bnQgTW9kZSAqLworI2RlZmluZQlBVVRPX0VOQUIJMHgyMAkvKiBBdXRvIEVuYWJsZXMgKi8KKyNkZWZpbmUJUng1CQkweDAJLyogUnggNSBCaXRzL0NoYXJhY3RlciAqLworI2RlZmluZQlSeDcJCTB4NDAJLyogUnggNyBCaXRzL0NoYXJhY3RlciAqLworI2RlZmluZQlSeDYJCTB4ODAJLyogUnggNiBCaXRzL0NoYXJhY3RlciAqLworI2RlZmluZQlSeDgJCTB4YzAJLyogUnggOCBCaXRzL0NoYXJhY3RlciAqLworCisvKiBXcml0ZSBSZWdpc3RlciA0ICovCisKKyNkZWZpbmUJUEFSX0VOQQkJMHgxCS8qIFBhcml0eSBFbmFibGUgKi8KKyNkZWZpbmUJUEFSX0VWRU4JMHgyCS8qIFBhcml0eSBFdmVuL09kZCogKi8KKworI2RlZmluZQlTWU5DX0VOQUIJMAkvKiBTeW5jIE1vZGVzIEVuYWJsZSAqLworI2RlZmluZQlTQjEJCTB4NAkvKiAxIHN0b3AgYml0L2NoYXIgKi8KKyNkZWZpbmUJU0IxNQkJMHg4CS8qIDEuNSBzdG9wIGJpdHMvY2hhciAqLworI2RlZmluZQlTQjIJCTB4YwkvKiAyIHN0b3AgYml0cy9jaGFyICovCisKKyNkZWZpbmUJTU9OU1lOQwkJMAkvKiA4IEJpdCBTeW5jIGNoYXJhY3RlciAqLworI2RlZmluZQlCSVNZTkMJCTB4MTAJLyogMTYgYml0IHN5bmMgY2hhcmFjdGVyICovCisjZGVmaW5lCVNETEMJCTB4MjAJLyogU0RMQyBNb2RlICgwMTExMTExMCBTeW5jIEZsYWcpICovCisjZGVmaW5lCUVYVFNZTkMJCTB4MzAJLyogRXh0ZXJuYWwgU3luYyBNb2RlICovCisKKyNkZWZpbmUJWDFDTEsJCTB4MAkvKiB4MSBjbG9jayBtb2RlICovCisjZGVmaW5lCVgxNkNMSwkJMHg0MAkvKiB4MTYgY2xvY2sgbW9kZSAqLworI2RlZmluZQlYMzJDTEsJCTB4ODAJLyogeDMyIGNsb2NrIG1vZGUgKi8KKyNkZWZpbmUJWDY0Q0xLCQkweEMwCS8qIHg2NCBjbG9jayBtb2RlICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDUgKi8KKworI2RlZmluZQlUeENSQ19FTkFCCTB4MQkvKiBUeCBDUkMgRW5hYmxlICovCisjZGVmaW5lCVJUUwkJMHgyCS8qIFJUUyAqLworI2RlZmluZQlTRExDX0NSQwkweDQJLyogU0RMQy9DUkMtMTYgKi8KKyNkZWZpbmUJVHhFTkFCCQkweDgJLyogVHggRW5hYmxlICovCisjZGVmaW5lCVNORF9CUksJCTB4MTAJLyogU2VuZCBCcmVhayAqLworI2RlZmluZQlUeDUJCTB4MAkvKiBUeCA1IGJpdHMgKG9yIGxlc3MpL2NoYXJhY3RlciAqLworI2RlZmluZQlUeDcJCTB4MjAJLyogVHggNyBiaXRzL2NoYXJhY3RlciAqLworI2RlZmluZQlUeDYJCTB4NDAJLyogVHggNiBiaXRzL2NoYXJhY3RlciAqLworI2RlZmluZQlUeDgJCTB4NjAJLyogVHggOCBiaXRzL2NoYXJhY3RlciAqLworI2RlZmluZQlEVFIJCTB4ODAJLyogRFRSICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDYgKFN5bmMgYml0cyAwLTcvU0RMQyBBZGRyZXNzIEZpZWxkKSAqLworCisvKiBXcml0ZSBSZWdpc3RlciA3IChTeW5jIGJpdHMgOC0xNS9TRExDIDAxMTExMTEwKSAqLworCisvKiBXcml0ZSBSZWdpc3RlciA4ICh0cmFuc21pdCBidWZmZXIpICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDkgKE1hc3RlciBpbnRlcnJ1cHQgY29udHJvbCkgKi8KKyNkZWZpbmUJVklTCTEJLyogVmVjdG9yIEluY2x1ZGVzIFN0YXR1cyAqLworI2RlZmluZQlOVgkyCS8qIE5vIFZlY3RvciAqLworI2RlZmluZQlETEMJNAkvKiBEaXNhYmxlIExvd2VyIENoYWluICovCisjZGVmaW5lCU1JRQk4CS8qIE1hc3RlciBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCVNUQVRISQkweDEwCS8qIFN0YXR1cyBoaWdoICovCisjZGVmaW5lCU5PUkVTRVQJMAkvKiBObyByZXNldCBvbiB3cml0ZSB0byBSOSAqLworI2RlZmluZQlDSFJCCTB4NDAJLyogUmVzZXQgY2hhbm5lbCBCICovCisjZGVmaW5lCUNIUkEJMHg4MAkvKiBSZXNldCBjaGFubmVsIEEgKi8KKyNkZWZpbmUJRkhXUkVTCTB4YzAJLyogRm9yY2UgaGFyZHdhcmUgcmVzZXQgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMTAgKG1pc2MgY29udHJvbCBiaXRzKSAqLworI2RlZmluZQlCSVQ2CTEJLyogNiBiaXQvOGJpdCBzeW5jICovCisjZGVmaW5lCUxPT1BNT0RFIDIJLyogU0RMQyBMb29wIG1vZGUgKi8KKyNkZWZpbmUJQUJVTkRFUgk0CS8qIEFib3J0L2ZsYWcgb24gU0RMQyB4bWl0IHVuZGVycnVuICovCisjZGVmaW5lCU1BUktJRExFIDgJLyogTWFyay9mbGFnIG9uIGlkbGUgKi8KKyNkZWZpbmUJR0FPUAkweDEwCS8qIEdvIGFjdGl2ZSBvbiBwb2xsICovCisjZGVmaW5lCU5SWgkwCS8qIE5SWiBtb2RlICovCisjZGVmaW5lCU5SWkkJMHgyMAkvKiBOUlpJIG1vZGUgKi8KKyNkZWZpbmUJRk0xCTB4NDAJLyogRk0xICh0cmFuc2l0aW9uID0gMSkgKi8KKyNkZWZpbmUJRk0wCTB4NjAJLyogRk0wICh0cmFuc2l0aW9uID0gMCkgKi8KKyNkZWZpbmUJQ1JDUFMJMHg4MAkvKiBDUkMgUHJlc2V0IEkvTyAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxMSAoQ2xvY2sgTW9kZSBjb250cm9sKSAqLworI2RlZmluZQlUUnhDWFQJMAkvKiBUUnhDID0gWHRhbCBvdXRwdXQgKi8KKyNkZWZpbmUJVFJ4Q1RDCTEJLyogVFJ4QyA9IFRyYW5zbWl0IGNsb2NrICovCisjZGVmaW5lCVRSeENCUgkyCS8qIFRSeEMgPSBCUiBHZW5lcmF0b3IgT3V0cHV0ICovCisjZGVmaW5lCVRSeENEUAkzCS8qIFRSeEMgPSBEUExMIG91dHB1dCAqLworI2RlZmluZQlUUnhDT0kJNAkvKiBUUnhDIE8vSSAqLworI2RlZmluZQlUQ1JUeENQCTAJLyogVHJhbnNtaXQgY2xvY2sgPSBSVHhDIHBpbiAqLworI2RlZmluZQlUQ1RSeENQCTgJLyogVHJhbnNtaXQgY2xvY2sgPSBUUnhDIHBpbiAqLworI2RlZmluZQlUQ0JSCTB4MTAJLyogVHJhbnNtaXQgY2xvY2sgPSBCUiBHZW5lcmF0b3Igb3V0cHV0ICovCisjZGVmaW5lCVRDRFBMTAkweDE4CS8qIFRyYW5zbWl0IGNsb2NrID0gRFBMTCBvdXRwdXQgKi8KKyNkZWZpbmUJUkNSVHhDUAkwCS8qIFJlY2VpdmUgY2xvY2sgPSBSVHhDIHBpbiAqLworI2RlZmluZQlSQ1RSeENQCTB4MjAJLyogUmVjZWl2ZSBjbG9jayA9IFRSeEMgcGluICovCisjZGVmaW5lCVJDQlIJMHg0MAkvKiBSZWNlaXZlIGNsb2NrID0gQlIgR2VuZXJhdG9yIG91dHB1dCAqLworI2RlZmluZQlSQ0RQTEwJMHg2MAkvKiBSZWNlaXZlIGNsb2NrID0gRFBMTCBvdXRwdXQgKi8KKyNkZWZpbmUJUlR4Q1gJMHg4MAkvKiBSVHhDIFh0YWwvTm8gWHRhbCAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxMiAobG93ZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIHRpbWUgY29uc3RhbnQpICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDEzICh1cHBlciBieXRlIG9mIGJhdWQgcmF0ZSBnZW5lcmF0b3IgdGltZSBjb25zdGFudCkgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMTQgKE1pc2MgY29udHJvbCBiaXRzKSAqLworI2RlZmluZQlCUkVOQUJMCTEJLyogQmF1ZCByYXRlIGdlbmVyYXRvciBlbmFibGUgKi8KKyNkZWZpbmUJQlJTUkMJMgkvKiBCYXVkIHJhdGUgZ2VuZXJhdG9yIHNvdXJjZSAqLworI2RlZmluZQlEVFJSRVEJNAkvKiBEVFIvUmVxdWVzdCBmdW5jdGlvbiAqLworI2RlZmluZQlBVVRPRUNITyA4CS8qIEF1dG8gRWNobyAqLworI2RlZmluZQlMT09QQkFLCTB4MTAJLyogTG9jYWwgbG9vcGJhY2sgKi8KKyNkZWZpbmUJU0VBUkNICTB4MjAJLyogRW50ZXIgc2VhcmNoIG1vZGUgKi8KKyNkZWZpbmUJUk1DCTB4NDAJLyogUmVzZXQgbWlzc2luZyBjbG9jayAqLworI2RlZmluZQlESVNEUExMCTB4NjAJLyogRGlzYWJsZSBEUExMICovCisjZGVmaW5lCVNTQlIJMHg4MAkvKiBTZXQgRFBMTCBzb3VyY2UgPSBCUiBnZW5lcmF0b3IgKi8KKyNkZWZpbmUJU1NSVHhDCTB4YTAJLyogU2V0IERQTEwgc291cmNlID0gUlR4QyAqLworI2RlZmluZQlTRk1NCTB4YzAJLyogU2V0IEZNIG1vZGUgKi8KKyNkZWZpbmUJU05SWkkJMHhlMAkvKiBTZXQgTlJaSSBtb2RlICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDE1IChleHRlcm5hbC9zdGF0dXMgaW50ZXJydXB0IGNvbnRyb2wpICovCisjZGVmaW5lCVpDSUUJMgkvKiBaZXJvIGNvdW50IElFICovCisjZGVmaW5lCURDRElFCTgJLyogRENEIElFICovCisjZGVmaW5lCVNZTkNJRQkweDEwCS8qIFN5bmMvaHVudCBJRSAqLworI2RlZmluZQlDVFNJRQkweDIwCS8qIENUUyBJRSAqLworI2RlZmluZQlUeFVJRQkweDQwCS8qIFR4IFVuZGVycnVuL0VPTSBJRSAqLworI2RlZmluZQlCUktJRQkweDgwCS8qIEJyZWFrL0Fib3J0IElFICovCisKKworLyogUmVhZCBSZWdpc3RlciAwICovCisjZGVmaW5lCVJ4X0NIX0FWCTB4MQkvKiBSeCBDaGFyYWN0ZXIgQXZhaWxhYmxlICovCisjZGVmaW5lCVpDT1VOVAkJMHgyCS8qIFplcm8gY291bnQgKi8KKyNkZWZpbmUJVHhfQlVGX0VNUAkweDQJLyogVHggQnVmZmVyIGVtcHR5ICovCisjZGVmaW5lCURDRAkJMHg4CS8qIERDRCAqLworI2RlZmluZQlTWU5DX0hVTlQJMHgxMAkvKiBTeW5jL2h1bnQgKi8KKyNkZWZpbmUJQ1RTCQkweDIwCS8qIENUUyAqLworI2RlZmluZQlUeEVPTQkJMHg0MAkvKiBUeCB1bmRlcnJ1biAqLworI2RlZmluZQlCUktfQUJSVAkweDgwCS8qIEJyZWFrL0Fib3J0ICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlBTExfU05UCQkweDEJLyogQWxsIHNlbnQgKi8KKy8qIFJlc2lkdWUgRGF0YSBmb3IgOCBSeCBiaXRzL2NoYXIgcHJvZ3JhbW1lZCAqLworI2RlZmluZQlSRVMzCQkweDgJLyogMC8zICovCisjZGVmaW5lCVJFUzQJCTB4NAkvKiAwLzQgKi8KKyNkZWZpbmUJUkVTNQkJMHhjCS8qIDAvNSAqLworI2RlZmluZQlSRVM2CQkweDIJLyogMC82ICovCisjZGVmaW5lCVJFUzcJCTB4YQkvKiAwLzcgKi8KKyNkZWZpbmUJUkVTOAkJMHg2CS8qIDAvOCAqLworI2RlZmluZQlSRVMxOAkJMHhlCS8qIDEvOCAqLworI2RlZmluZQlSRVMyOAkJMHgwCS8qIDIvOCAqLworLyogU3BlY2lhbCBSeCBDb25kaXRpb24gSW50ZXJydXB0cyAqLworI2RlZmluZQlQQVJfRVJSCQkweDEwCS8qIFBhcml0eSBlcnJvciAqLworI2RlZmluZQlSeF9PVlIJCTB4MjAJLyogUnggT3ZlcnJ1biBFcnJvciAqLworI2RlZmluZQlDUkNfRVJSCQkweDQwCS8qIENSQy9GcmFtaW5nIEVycm9yICovCisjZGVmaW5lCUVORF9GUgkJMHg4MAkvKiBFbmQgb2YgRnJhbWUgKFNETEMpICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMiAoY2hhbm5lbCBiIG9ubHkpIC0gSW50ZXJydXB0IHZlY3RvciAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDMgKGludGVycnVwdCBwZW5kaW5nIHJlZ2lzdGVyKSBjaCBhIG9ubHkgKi8KKyNkZWZpbmUJQ0hCRVhUCTB4MQkJLyogQ2hhbm5lbCBCIEV4dC9TdGF0IElQICovCisjZGVmaW5lCUNIQlR4SVAJMHgyCQkvKiBDaGFubmVsIEIgVHggSVAgKi8KKyNkZWZpbmUJQ0hCUnhJUAkweDQJCS8qIENoYW5uZWwgQiBSeCBJUCAqLworI2RlZmluZQlDSEFFWFQJMHg4CQkvKiBDaGFubmVsIEEgRXh0L1N0YXQgSVAgKi8KKyNkZWZpbmUJQ0hBVHhJUAkweDEwCQkvKiBDaGFubmVsIEEgVHggSVAgKi8KKyNkZWZpbmUJQ0hBUnhJUAkweDIwCQkvKiBDaGFubmVsIEEgUnggSVAgKi8KKworLyogUmVhZCBSZWdpc3RlciA4IChyZWNlaXZlIGRhdGEgcmVnaXN0ZXIpICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMTAgIChtaXNjIHN0YXR1cyBiaXRzKSAqLworI2RlZmluZQlPTkxPT1AJMgkJLyogT24gbG9vcCAqLworI2RlZmluZQlMT09QU0VORCAweDEwCQkvKiBMb29wIHNlbmRpbmcgKi8KKyNkZWZpbmUJQ0xLMk1JUwkweDQwCQkvKiBUd28gY2xvY2tzIG1pc3NpbmcgKi8KKyNkZWZpbmUJQ0xLMU1JUwkweDgwCQkvKiBPbmUgY2xvY2sgbWlzc2luZyAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDEyIChsb3dlciBieXRlIG9mIGJhdWQgcmF0ZSBnZW5lcmF0b3IgY29uc3RhbnQpICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMTMgKHVwcGVyIGJ5dGUgb2YgYmF1ZCByYXRlIGdlbmVyYXRvciBjb25zdGFudCkgKi8KKworLyogUmVhZCBSZWdpc3RlciAxNSAodmFsdWUgb2YgV1IgMTUpICovCisKKy8qIFo4NUMzMC9aODUyMzAgRW5oYW5jZWQgU0NDIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDcnIChTRExDL0hETEMgUHJvZ3JhbW1hYmxlIEVuaGFuY2VtZW50cykgKi8KKyNkZWZpbmUgQVVUT1RYRgkweDAxCQkvKiBBdXRvIFR4IEZsYWcgKi8KKyNkZWZpbmUgQVVUT0VPTSAweDAyCQkvKiBBdXRvIEVPTSBMYXRjaCBSZXNldCAqLworI2RlZmluZSBBVVRPUlRTCTB4MDQJCS8qIEF1dG8gUlRTICovCisjZGVmaW5lIFRYRE5SWkkgMHgwOAkJLyogVHhEIFB1bGxlZCBIaWdoIGluIFNETEMgTlJaSSBtb2RlICovCisjZGVmaW5lIFJYRklGT0ggMHgwOAkJLyogWjg1MjMwOiBJbnQgb24gUlggRklGTyBoYWxmIGZ1bGwgKi8KKyNkZWZpbmUgRkFTVERUUiAweDEwCQkvKiBGYXN0IERUUi9SRVEgTW9kZSAqLworI2RlZmluZSBDUkNDQkNSCTB4MjAJCS8qIENSQyBDaGVjayBCeXRlcyBDb21wbGV0ZWx5IFJlY2VpdmVkICovCisjZGVmaW5lIFRYRklGT0UgMHgyMAkJLyogWjg1MjMwOiBJbnQgb24gVFggRklGTyBjb21wbGV0ZWx5IGVtcHR5ICovCisjZGVmaW5lIEVYVFJERU4JMHg0MAkJLyogRXh0ZW5kZWQgUmVhZCBFbmFibGVkICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDE1IChleHRlcm5hbC9zdGF0dXMgaW50ZXJydXB0IGNvbnRyb2wpICovCisjZGVmaW5lIFNIRExDRQkxCQkvKiBTRExDL0hETEMgRW5oYW5jZW1lbnRzIEVuYWJsZSAqLworI2RlZmluZSBGSUZPRQk0CQkvKiBGSUZPIEVuYWJsZSAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDYgKGZyYW1lIHN0YXR1cyBGSUZPKSAqLworI2RlZmluZSBCQ0xTQgkweGZmCQkvKiBMU0Igb2YgMTQgYml0cyBjb3VudCAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDcgKGZyYW1lIHN0YXR1cyBGSUZPKSAqLworI2RlZmluZSBCQ01TQgkweDNmCQkvKiBNU0Igb2YgMTQgYml0cyBjb3VudCAqLworI2RlZmluZSBGREEJMHg0MAkJLyogRklGTyBEYXRhIEF2YWlsYWJsZSBTdGF0dXMgKi8KKyNkZWZpbmUgRk9TCTB4ODAJCS8qIEZJRk8gT3ZlcmZsb3cgU3RhdHVzICovCg==