ZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL2Jsa3RyYW5zLmggYi9pbmNsdWRlL2xpbnV4L210ZC9ibGt0cmFucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYmMyZTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9ibGt0cmFucy5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiAkSWQ6IGJsa3RyYW5zLmgsdiAxLjUgMjAwMy8wNi8yMyAxMjowMDowOCBkd213MiBFeHAgJAorICoKKyAqIChDKSAyMDAzIERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBJbnRlcmZhY2UgdG8gTGludXggYmxvY2sgbGF5ZXIgZm9yIE1URCAndHJhbnNsYXRpb24gbGF5ZXJzJy4KKyAqCisgKi8KKworI2lmbmRlZiBfX01URF9UUkFOU19IX18KKyNkZWZpbmUgX19NVERfVFJBTlNfSF9fCisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKK3N0cnVjdCBoZF9nZW9tZXRyeTsKK3N0cnVjdCBtdGRfaW5mbzsKK3N0cnVjdCBtdGRfYmxrdHJhbnNfb3BzOworc3RydWN0IGZpbGU7CitzdHJ1Y3QgaW5vZGU7CisKK3N0cnVjdCBtdGRfYmxrdHJhbnNfZGV2IHsKKwlzdHJ1Y3QgbXRkX2Jsa3RyYW5zX29wcyAqdHI7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCWludCBkZXZudW07CisJaW50IGJsa3NpemU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCByZWFkb25seTsKKwl2b2lkICpibGtjb3JlX3ByaXY7IC8qIGdlbmRpc2sgaW4gMi41LCBkZXZmc19oYW5kbGUgaW4gMi40ICovCit9OworCitzdHJ1Y3QgYmxrY29yZV9wcml2OyAvKiBEaWZmZXJzIGZvciAyLjQgYW5kIDIuNSBrZXJuZWxzOyBwcml2YXRlICovCisKK3N0cnVjdCBtdGRfYmxrdHJhbnNfb3BzIHsKKwljaGFyICpuYW1lOworCWludCBtYWpvcjsKKwlpbnQgcGFydF9iaXRzOworCisJLyogQWNjZXNzIGZ1bmN0aW9ucyAqLworCWludCAoKnJlYWRzZWN0KShzdHJ1Y3QgbXRkX2Jsa3RyYW5zX2RldiAqZGV2LAorCQkgICAgdW5zaWduZWQgbG9uZyBibG9jaywgY2hhciAqYnVmZmVyKTsKKwlpbnQgKCp3cml0ZXNlY3QpKHN0cnVjdCBtdGRfYmxrdHJhbnNfZGV2ICpkZXYsCisJCSAgICAgdW5zaWduZWQgbG9uZyBibG9jaywgY2hhciAqYnVmZmVyKTsKKworCS8qIEJsb2NrIGxheWVyIGlvY3RscyAqLworCWludCAoKmdldGdlbykoc3RydWN0IG10ZF9ibGt0cmFuc19kZXYgKmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pOworCWludCAoKmZsdXNoKShzdHJ1Y3QgbXRkX2Jsa3RyYW5zX2RldiAqZGV2KTsKKworCS8qIENhbGxlZCB3aXRoIG10ZF90YWJsZV9tdXRleCBoZWxkOyBubyByYWNlIHdpdGggYWRkL3JlbW92ZSAqLworCWludCAoKm9wZW4pKHN0cnVjdCBtdGRfYmxrdHJhbnNfZGV2ICpkZXYpOworCWludCAoKnJlbGVhc2UpKHN0cnVjdCBtdGRfYmxrdHJhbnNfZGV2ICpkZXYpOworCisJLyogQ2FsbGVkIG9uIHtkZSx9cmVnaXN0cmF0aW9uIGFuZCBvbiBzdWJzZXF1ZW50IGFkZGl0aW9uL3JlbW92YWwKKwkgICBvZiBkZXZpY2VzLCB3aXRoIG10ZF90YWJsZV9tdXRleCBoZWxkLiAqLworCXZvaWQgKCphZGRfbXRkKShzdHJ1Y3QgbXRkX2Jsa3RyYW5zX29wcyAqdHIsIHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKKwl2b2lkICgqcmVtb3ZlX2Rldikoc3RydWN0IG10ZF9ibGt0cmFuc19kZXYgKmRldik7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldnM7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCisJc3RydWN0IG10ZF9ibGtjb3JlX3ByaXYgKmJsa2NvcmVfcHJpdjsKK307CisKK2V4dGVybiBpbnQgcmVnaXN0ZXJfbXRkX2Jsa3RyYW5zKHN0cnVjdCBtdGRfYmxrdHJhbnNfb3BzICp0cik7CitleHRlcm4gaW50IGRlcmVnaXN0ZXJfbXRkX2Jsa3RyYW5zKHN0cnVjdCBtdGRfYmxrdHJhbnNfb3BzICp0cik7CitleHRlcm4gaW50IGFkZF9tdGRfYmxrdHJhbnNfZGV2KHN0cnVjdCBtdGRfYmxrdHJhbnNfZGV2ICpkZXYpOworZXh0ZXJuIGludCBkZWxfbXRkX2Jsa3RyYW5zX2RldihzdHJ1Y3QgbXRkX2Jsa3RyYW5zX2RldiAqZGV2KTsKKwkJCQkgCisKKyNlbmRpZiAvKiBfX01URF9UUkFOU19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL2NmaS5oIGIvaW5jbHVkZS9saW51eC9tdGQvY2ZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVkOGM1OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2NmaS5oCkBAIC0wLDAgKzEsMzk0IEBACisKKy8qIENvbW1vbiBGbGFzaCBJbnRlcmZhY2Ugc3RydWN0dXJlcyAKKyAqIFNlZSBodHRwOi8vc3VwcG9ydC5pbnRlbC5jb20vZGVzaWduL2ZsYXNoL3RlY2hub3RlL2luZGV4Lmh0bQorICogJElkOiBjZmkuaCx2IDEuNTAgMjAwNC8xMS8yMCAxMjo0Njo1MSBkd213MiBFeHAgJAorICovCisKKyNpZm5kZWYgX19NVERfQ0ZJX0hfXworI2RlZmluZSBfX01URF9DRklfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9mbGFzaGNoaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL2NmaV9lbmRpYW4uaD4KKworI2lmZGVmIENPTkZJR19NVERfQ0ZJX0kxCisjZGVmaW5lIGNmaV9pbnRlcmxlYXZlKGNmaSkgMQorI2RlZmluZSBjZmlfaW50ZXJsZWF2ZV9pc18xKGNmaSkgKGNmaV9pbnRlcmxlYXZlKGNmaSkgPT0gMSkKKyNlbHNlCisjZGVmaW5lIGNmaV9pbnRlcmxlYXZlX2lzXzEoY2ZpKSAoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01URF9DRklfSTIKKyMgaWZkZWYgY2ZpX2ludGVybGVhdmUKKyMgIHVuZGVmIGNmaV9pbnRlcmxlYXZlCisjICBkZWZpbmUgY2ZpX2ludGVybGVhdmUoY2ZpKSAoKGNmaSktPmludGVybGVhdmUpCisjIGVsc2UKKyMgIGRlZmluZSBjZmlfaW50ZXJsZWF2ZShjZmkpIDIKKyMgZW5kaWYKKyNkZWZpbmUgY2ZpX2ludGVybGVhdmVfaXNfMihjZmkpIChjZmlfaW50ZXJsZWF2ZShjZmkpID09IDIpCisjZWxzZQorI2RlZmluZSBjZmlfaW50ZXJsZWF2ZV9pc18yKGNmaSkgKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NVERfQ0ZJX0k0CisjIGlmZGVmIGNmaV9pbnRlcmxlYXZlCisjICB1bmRlZiBjZmlfaW50ZXJsZWF2ZQorIyAgZGVmaW5lIGNmaV9pbnRlcmxlYXZlKGNmaSkgKChjZmkpLT5pbnRlcmxlYXZlKQorIyBlbHNlCisjICBkZWZpbmUgY2ZpX2ludGVybGVhdmUoY2ZpKSA0CisjIGVuZGlmCisjZGVmaW5lIGNmaV9pbnRlcmxlYXZlX2lzXzQoY2ZpKSAoY2ZpX2ludGVybGVhdmUoY2ZpKSA9PSA0KQorI2Vsc2UKKyNkZWZpbmUgY2ZpX2ludGVybGVhdmVfaXNfNChjZmkpICgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTVREX0NGSV9JOAorIyBpZmRlZiBjZmlfaW50ZXJsZWF2ZQorIyAgdW5kZWYgY2ZpX2ludGVybGVhdmUKKyMgIGRlZmluZSBjZmlfaW50ZXJsZWF2ZShjZmkpICgoY2ZpKS0+aW50ZXJsZWF2ZSkKKyMgZWxzZQorIyAgZGVmaW5lIGNmaV9pbnRlcmxlYXZlKGNmaSkgOAorIyBlbmRpZgorI2RlZmluZSBjZmlfaW50ZXJsZWF2ZV9pc184KGNmaSkgKGNmaV9pbnRlcmxlYXZlKGNmaSkgPT0gOCkKKyNlbHNlCisjZGVmaW5lIGNmaV9pbnRlcmxlYXZlX2lzXzgoY2ZpKSAoMCkKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBjZmlfaW50ZXJsZWF2ZV9zdXBwb3J0ZWQoaW50IGkpCit7CisJc3dpdGNoIChpKSB7CisjaWZkZWYgQ09ORklHX01URF9DRklfSTEKKwljYXNlIDE6CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVREX0NGSV9JMgorCWNhc2UgMjoKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVERfQ0ZJX0k0CisJY2FzZSA0OgorI2VuZGlmCisjaWZkZWYgQ09ORklHX01URF9DRklfSTgKKwljYXNlIDg6CisjZW5kaWYKKwkJcmV0dXJuIDE7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKworLyogTkI6IHRoZXNlIHZhbHVlcyBtdXN0IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gbWVldCB0aGUgCisgKiAgICAgZGV2aWNlIHR5cGUgKHg4LCB4MTYsIHgzMikuICBFZy4gYSAzMiBiaXQgZGV2aWNlIGlzIDQgeCA4IGJ5dGVzLiAKKyAqICAgICBUaGVzZSBudW1iZXJzIGFyZSB1c2VkIGluIGNhbGN1bGF0aW9ucy4KKyAqLworI2RlZmluZSBDRklfREVWSUNFVFlQRV9YOCAgKDggLyA4KQorI2RlZmluZSBDRklfREVWSUNFVFlQRV9YMTYgKDE2IC8gOCkKKyNkZWZpbmUgQ0ZJX0RFVklDRVRZUEVfWDMyICgzMiAvIDgpCisjZGVmaW5lIENGSV9ERVZJQ0VUWVBFX1g2NCAoNjQgLyA4KQorCisvKiBOQjogV2Uga2VlcCB0aGVzZSBzdHJ1Y3R1cmVzIGluIG1lbW9yeSBpbiBIT1NUIGJ5dGVvcmRlciwgZXhjZXB0CisgKiB3aGVyZSBpbmRpdmlkdWFsbHkgbm90ZWQuCisgKi8KKworLyogQmFzaWMgUXVlcnkgU3RydWN0dXJlICovCitzdHJ1Y3QgY2ZpX2lkZW50IHsKKwl1aW50OF90ICBxcnlbM107CisJdWludDE2X3QgUF9JRDsKKwl1aW50MTZfdCBQX0FEUjsKKwl1aW50MTZfdCBBX0lEOworCXVpbnQxNl90IEFfQURSOworCXVpbnQ4X3QgIFZjY01pbjsKKwl1aW50OF90ICBWY2NNYXg7CisJdWludDhfdCAgVnBwTWluOworCXVpbnQ4X3QgIFZwcE1heDsKKwl1aW50OF90ICBXb3JkV3JpdGVUaW1lb3V0VHlwOworCXVpbnQ4X3QgIEJ1ZldyaXRlVGltZW91dFR5cDsKKwl1aW50OF90ICBCbG9ja0VyYXNlVGltZW91dFR5cDsKKwl1aW50OF90ICBDaGlwRXJhc2VUaW1lb3V0VHlwOworCXVpbnQ4X3QgIFdvcmRXcml0ZVRpbWVvdXRNYXg7CisJdWludDhfdCAgQnVmV3JpdGVUaW1lb3V0TWF4OworCXVpbnQ4X3QgIEJsb2NrRXJhc2VUaW1lb3V0TWF4OworCXVpbnQ4X3QgIENoaXBFcmFzZVRpbWVvdXRNYXg7CisJdWludDhfdCAgRGV2U2l6ZTsKKwl1aW50MTZfdCBJbnRlcmZhY2VEZXNjOworCXVpbnQxNl90IE1heEJ1ZldyaXRlU2l6ZTsKKwl1aW50OF90ICBOdW1FcmFzZVJlZ2lvbnM7CisJdWludDMyX3QgRXJhc2VSZWdpb25JbmZvWzBdOyAvKiBOb3QgaG9zdCBvcmRlcmVkICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBFeHRlbmRlZCBRdWVyeSBTdHJ1Y3R1cmUgZm9yIGJvdGggUFJJIGFuZCBBTFQgKi8KKworc3RydWN0IGNmaV9leHRxdWVyeSB7CisJdWludDhfdCAgcHJpWzNdOworCXVpbnQ4X3QgIE1ham9yVmVyc2lvbjsKKwl1aW50OF90ICBNaW5vclZlcnNpb247Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBWZW5kb3ItU3BlY2lmaWMgUFJJIGZvciBJbnRlbC9TaGFycCBFeHRlbmRlZCBDb21tYW5kIFNldCAoMHgwMDAxKSAqLworCitzdHJ1Y3QgY2ZpX3ByaV9pbnRlbGV4dCB7CisJdWludDhfdCAgcHJpWzNdOworCXVpbnQ4X3QgIE1ham9yVmVyc2lvbjsKKwl1aW50OF90ICBNaW5vclZlcnNpb247CisJdWludDMyX3QgRmVhdHVyZVN1cHBvcnQ7IC8qIGlmIGJpdCAzMSBpcyBzZXQgdGhlbiBhbiBhZGRpdGlvbmFsIHVpbnQzMl90IGZlYXR1cmUKKwkJCQkgICAgYmxvY2sgZm9sbG93cyAtIEZJWE1FIC0gbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KKwl1aW50OF90ICBTdXNwZW5kQ21kU3VwcG9ydDsKKwl1aW50MTZfdCBCbGtTdGF0dXNSZWdNYXNrOworCXVpbnQ4X3QgIFZjY09wdGltYWw7CisJdWludDhfdCAgVnBwT3B0aW1hbDsKKwl1aW50OF90ICBOdW1Qcm90ZWN0aW9uRmllbGRzOworCXVpbnQxNl90IFByb3RSZWdBZGRyOworCXVpbnQ4X3QgIEZhY3RQcm90UmVnU2l6ZTsKKwl1aW50OF90ICBVc2VyUHJvdFJlZ1NpemU7CisJdWludDhfdCAgZXh0cmFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgY2ZpX2ludGVsZXh0X2Jsb2NraW5mbyB7CisJdWludDE2X3QgTnVtSWRlbnRCbG9ja3M7CisJdWludDE2X3QgQmxvY2tTaXplOworCXVpbnQxNl90IE1pbkJsb2NrRXJhc2VDeWNsZXM7CisJdWludDhfdCAgQml0c1BlckNlbGw7CisJdWludDhfdCAgQmxvY2tDYXA7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgY2ZpX2ludGVsZXh0X3JlZ2lvbmluZm8geworCXVpbnQxNl90IE51bUlkZW50UGFydGl0aW9uczsKKwl1aW50OF90ICBOdW1PcEFsbG93ZWQ7CisJdWludDhfdCAgTnVtT3BBbGxvd2VkU2ltUHJvZ01vZGU7CisJdWludDhfdCAgTnVtT3BBbGxvd2VkU2ltRXJhTW9kZTsKKwl1aW50OF90ICBOdW1CbG9ja1R5cGVzOworCXN0cnVjdCBjZmlfaW50ZWxleHRfYmxvY2tpbmZvIEJsb2NrVHlwZXNbMV07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBWZW5kb3ItU3BlY2lmaWMgUFJJIGZvciBBTUQvRnVqaXRzdSBFeHRlbmRlZCBDb21tYW5kIFNldCAoMHgwMDAyKSAqLworCitzdHJ1Y3QgY2ZpX3ByaV9hbWRzdGQgeworCXVpbnQ4X3QgIHByaVszXTsKKwl1aW50OF90ICBNYWpvclZlcnNpb247CisJdWludDhfdCAgTWlub3JWZXJzaW9uOworCXVpbnQ4X3QgIFNpbGljb25SZXZpc2lvbjsgLyogYml0cyAxLTA6IEFkZHJlc3MgU2Vuc2l0aXZlIFVubG9jayAqLworCXVpbnQ4X3QgIEVyYXNlU3VzcGVuZDsKKwl1aW50OF90ICBCbGtQcm90OworCXVpbnQ4X3QgIFRtcEJsa1VucHJvdGVjdDsKKwl1aW50OF90ICBCbGtQcm90VW5wcm90OworCXVpbnQ4X3QgIFNpbXVsdGFuZW91c09wczsKKwl1aW50OF90ICBCdXJzdE1vZGU7CisJdWludDhfdCAgUGFnZU1vZGU7CisJdWludDhfdCAgVnBwTWluOworCXVpbnQ4X3QgIFZwcE1heDsKKwl1aW50OF90ICBUb3BCb3R0b207Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgY2ZpX3ByaV9xdWVyeSB7CisJdWludDhfdCAgTnVtRmllbGRzOworCXVpbnQzMl90IFByb3RGaWVsZFsxXTsgLyogTm90IGhvc3Qgb3JkZXJlZCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGNmaV9icmlfcXVlcnkgeworCXVpbnQ4X3QgIFBhZ2VNb2RlUmVhZENhcDsKKwl1aW50OF90ICBOdW1GaWVsZHM7CisJdWludDMyX3QgQ29uZkZpZWxkWzFdOyAvKiBOb3QgaG9zdCBvcmRlcmVkICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFBfSURfTk9ORSAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQX0lEX0lOVEVMX0VYVCAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUF9JRF9BTURfU1REICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFBfSURfSU5URUxfU1REICAgICAgICAgIDB4MDAwMworI2RlZmluZSBQX0lEX0FNRF9FWFQgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUF9JRF9XSU5CT05EICAgICAgICAgICAgMHgwMDA2CisjZGVmaW5lIFBfSURfU1RfQURWICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBQX0lEX01JVFNVQklTSElfU1REICAgICAweDAxMDAKKyNkZWZpbmUgUF9JRF9NSVRTVUJJU0hJX0VYVCAgICAgMHgwMTAxCisjZGVmaW5lIFBfSURfU1NUX1BBR0UgICAgICAgICAgIDB4MDEwMgorI2RlZmluZSBQX0lEX0lOVEVMX1BFUkZPUk1BTkNFICAweDAyMDAKKyNkZWZpbmUgUF9JRF9JTlRFTF9EQVRBICAgICAgICAgMHgwMjEwCisjZGVmaW5lIFBfSURfUkVTRVJWRUQgICAgICAgICAgIDB4ZmZmZgorCisKKyNkZWZpbmUgQ0ZJX01PREVfQ0ZJCTEKKyNkZWZpbmUgQ0ZJX01PREVfSkVERUMJMAorCitzdHJ1Y3QgY2ZpX3ByaXZhdGUgeworCXVpbnQxNl90IGNtZHNldDsKKwl2b2lkICpjbWRzZXRfcHJpdjsKKwlpbnQgaW50ZXJsZWF2ZTsKKwlpbnQgZGV2aWNlX3R5cGU7CisJaW50IGNmaV9tb2RlOwkJLyogQXJlIHdlIGEgSkVERUMgZGV2aWNlIHByZXRlbmRpbmcgdG8gYmUgQ0ZJPyAqLworCWludCBhZGRyX3VubG9jazE7CisJaW50IGFkZHJfdW5sb2NrMjsKKwlzdHJ1Y3QgbXRkX2luZm8gKigqY21kc2V0X3NldHVwKShzdHJ1Y3QgbWFwX2luZm8gKik7CisJc3RydWN0IGNmaV9pZGVudCAqY2ZpcTsgLyogRm9yIG5vdyBvbmx5IG9uZS4gV2UgaW5zaXN0IHRoYXQgYWxsIGRldnMKKwkJCQkgIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZS4gKi8KKwlpbnQgbWZyLCBpZDsKKwlpbnQgbnVtY2hpcHM7CisJdW5zaWduZWQgbG9uZyBjaGlwc2hpZnQ7IC8qIEJlY2F1c2UgdGhleSdyZSBvZiB0aGUgc2FtZSB0eXBlICovCisJY29uc3QgY2hhciAqaW1fbmFtZTsJIC8qIGludGVyX21vZHVsZSBuYW1lIGZvciBjbWRzZXRfc2V0dXAgKi8KKwlzdHJ1Y3QgZmxjaGlwIGNoaXBzWzBdOyAgLyogcGVyLWNoaXAgZGF0YSBzdHJ1Y3R1cmUgZm9yIGVhY2ggY2hpcCAqLworfTsKKworLyoKKyAqIFJldHVybnMgdGhlIGNvbW1hbmQgYWRkcmVzcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGdlb21ldHJ5LgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNmaV9idWlsZF9jbWRfYWRkcih1aW50MzJfdCBjbWRfb2ZzLCBpbnQgaW50ZXJsZWF2ZSwgaW50IHR5cGUpCit7CisJcmV0dXJuIChjbWRfb2ZzICogdHlwZSkgKiBpbnRlcmxlYXZlOworfQorCisvKgorICogVHJhbnNmb3JtcyB0aGUgQ0ZJIGNvbW1hbmQgZm9yIHRoZSBnaXZlbiBnZW9tZXRyeSAoYnVzIHdpZHRoICYgaW50ZXJsZWF2ZSkuCisgKiBJdCBsb29rcyB0b28gbG9uZyB0byBiZSBpbmxpbmUsIGJ1dCBpbiB0aGUgY29tbW9uIGNhc2UgaXQgc2hvdWxkIGFsbW9zdCBhbGwKKyAqIGdldCBvcHRpbWlzZWQgYXdheS4gCisgKi8KK3N0YXRpYyBpbmxpbmUgbWFwX3dvcmQgY2ZpX2J1aWxkX2NtZCh1X2NoYXIgY21kLCBzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGNmaV9wcml2YXRlICpjZmkpCit7CisJbWFwX3dvcmQgdmFsID0geyB7MH0gfTsKKwlpbnQgd29yZHdpZHRoLCB3b3Jkc19wZXJfYnVzLCBjaGlwX21vZGUsIGNoaXBzX3Blcl93b3JkOworCXVuc2lnbmVkIGxvbmcgb25lY21kOworCWludCBpOworCisJLyogV2UgZG8gaXQgdGhpcyB3YXkgdG8gZ2l2ZSB0aGUgY29tcGlsZXIgYSBmaWdodGluZyBjaGFuY2UgCisJICAgb2Ygb3B0aW1pc2luZyBhd2F5IGFsbCB0aGUgY3JhcCBmb3IgJ2Jhbmt3aWR0aCcgbGFyZ2VyIHRoYW4KKwkgICBhbiB1bnNpZ25lZCBsb25nLCBpbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgdGhhdCBzdXBwb3J0IGlzCisJICAgZGlzYWJsZWQgKi8KKwlpZiAobWFwX2Jhbmt3aWR0aF9pc19sYXJnZShtYXApKSB7CisJCXdvcmR3aWR0aCA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJd29yZHNfcGVyX2J1cyA9IChtYXBfYmFua3dpZHRoKG1hcCkpIC8gd29yZHdpZHRoOyAvLyBpLmUuIG5vcm1hbGx5IDEKKwl9IGVsc2UgeworCQl3b3Jkd2lkdGggPSBtYXBfYmFua3dpZHRoKG1hcCk7CisJCXdvcmRzX3Blcl9idXMgPSAxOworCX0KKwkKKwljaGlwX21vZGUgPSBtYXBfYmFua3dpZHRoKG1hcCkgLyBjZmlfaW50ZXJsZWF2ZShjZmkpOworCWNoaXBzX3Blcl93b3JkID0gd29yZHdpZHRoICogY2ZpX2ludGVybGVhdmUoY2ZpKSAvIG1hcF9iYW5rd2lkdGgobWFwKTsKKworCS8qIEZpcnN0LCBkZXRlcm1pbmUgd2hhdCB0aGUgYml0LXBhdHRlcm4gc2hvdWxkIGJlIGZvciBhIHNpbmdsZQorCSAgIGRldmljZSwgYWNjb3JkaW5nIHRvIGNoaXAgbW9kZSBhbmQgZW5kaWFubmVzcy4uLiAqLworCXN3aXRjaCAoY2hpcF9tb2RlKSB7CisJZGVmYXVsdDogQlVHKCk7CisJY2FzZSAxOgorCQlvbmVjbWQgPSBjbWQ7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJb25lY21kID0gY3B1X3RvX2NmaTE2KGNtZCk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJb25lY21kID0gY3B1X3RvX2NmaTMyKGNtZCk7CisJCWJyZWFrOworCX0KKworCS8qIE5vdyByZXBsaWNhdGUgaXQgYWNyb3NzIHRoZSBzaXplIG9mIGFuIHVuc2lnbmVkIGxvbmcsIG9yIAorCSAgIGp1c3QgdG8gdGhlIGJ1cyB3aWR0aCBhcyBhcHByb3ByaWF0ZSAqLworCXN3aXRjaCAoY2hpcHNfcGVyX3dvcmQpIHsKKwlkZWZhdWx0OiBCVUcoKTsKKyNpZiBCSVRTX1BFUl9MT05HID49IDY0CisJY2FzZSA4OgorCQlvbmVjbWQgfD0gKG9uZWNtZCA8PCAoY2hpcF9tb2RlICogMzIpKTsKKyNlbmRpZgorCWNhc2UgNDoKKwkJb25lY21kIHw9IChvbmVjbWQgPDwgKGNoaXBfbW9kZSAqIDE2KSk7CisJY2FzZSAyOgorCQlvbmVjbWQgfD0gKG9uZWNtZCA8PCAoY2hpcF9tb2RlICogOCkpOworCWNhc2UgMToKKwkJOworCX0KKworCS8qIEFuZCBmaW5hbGx5LCBmb3IgdGhlIG11bHRpLXdvcmQgY2FzZSwgcmVwbGljYXRlIGl0IAorCSAgIGluIGFsbCB3b3JkcyBpbiB0aGUgc3RydWN0dXJlICovCisJZm9yIChpPTA7IGkgPCB3b3Jkc19wZXJfYnVzOyBpKyspIHsKKwkJdmFsLnhbaV0gPSBvbmVjbWQ7CisJfQorCisJcmV0dXJuIHZhbDsKK30KKyNkZWZpbmUgQ01EKHgpICBjZmlfYnVpbGRfY21kKCh4KSwgbWFwLCBjZmkpCisKKy8qCisgKiBTZW5kcyBhIENGSSBjb21tYW5kIHRvIGEgYmFuayBvZiBmbGFzaCBmb3IgdGhlIGdpdmVuIGdlb21ldHJ5LgorICoKKyAqIFJldHVybnMgdGhlIG9mZnNldCBpbiBmbGFzaCB3aGVyZSB0aGUgY29tbWFuZCB3YXMgd3JpdHRlbi4KKyAqIElmIHByZXZfdmFsIGlzIG5vbi1udWxsLCBpdCB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgYXQgdGhlIGNvbW1hbmQgYWRkcmVzcywKKyAqIGJlZm9yZSB0aGUgY29tbWFuZCB3YXMgd3JpdHRlbi4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBjZmlfc2VuZF9nZW5fY21kKHVfY2hhciBjbWQsIHVpbnQzMl90IGNtZF9hZGRyLCB1aW50MzJfdCBiYXNlLAorCQkJCXN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSwKKwkJCQlpbnQgdHlwZSwgbWFwX3dvcmQgKnByZXZfdmFsKQoreworCW1hcF93b3JkIHZhbDsKKwl1aW50MzJfdCBhZGRyID0gYmFzZSArIGNmaV9idWlsZF9jbWRfYWRkcihjbWRfYWRkciwgY2ZpX2ludGVybGVhdmUoY2ZpKSwgdHlwZSk7CisKKwl2YWwgPSBjZmlfYnVpbGRfY21kKGNtZCwgbWFwLCBjZmkpOworCisJaWYgKHByZXZfdmFsKQorCQkqcHJldl92YWwgPSBtYXBfcmVhZChtYXAsIGFkZHIpOworCisJbWFwX3dyaXRlKG1hcCwgdmFsLCBhZGRyKTsKKworCXJldHVybiBhZGRyIC0gYmFzZTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IGNmaV9yZWFkX3F1ZXJ5KHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1aW50MzJfdCBhZGRyKQoreworCW1hcF93b3JkIHZhbCA9IG1hcF9yZWFkKG1hcCwgYWRkcik7CisKKwlpZiAobWFwX2Jhbmt3aWR0aF9pc18xKG1hcCkpIHsKKwkJcmV0dXJuIHZhbC54WzBdOworCX0gZWxzZSBpZiAobWFwX2Jhbmt3aWR0aF9pc18yKG1hcCkpIHsKKwkJcmV0dXJuIGNmaTE2X3RvX2NwdSh2YWwueFswXSk7CisJfSBlbHNlIHsKKwkJLyogTm8gcG9pbnQgaW4gYSA2NC1iaXQgYnl0ZXN3YXAgc2luY2UgdGhhdCB3b3VsZCBqdXN0IGJlCisJCSAgIHN3YXBwaW5nIHRoZSByZXNwb25zZXMgZnJvbSBkaWZmZXJlbnQgY2hpcHMsIGFuZCB3ZSBhcmUKKwkJICAgb25seSBpbnRlcmVzdGVkIGluIG9uZSBjaGlwIChhIHJlcHJlc2VudGF0aXZlIHNhbXBsZSkgKi8KKwkJcmV0dXJuIGNmaTMyX3RvX2NwdSh2YWwueFswXSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2ZpX3VkZWxheShpbnQgdXMpCit7CisJaWYgKHVzID49IDEwMDApIHsKKwkJbXNsZWVwKCh1cys5OTkpLzEwMDApOworCX0gZWxzZSB7CisJCXVkZWxheSh1cyk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGNmaV9zcGluX2xvY2soc3BpbmxvY2tfdCAqbXV0ZXgpCit7CisJc3Bpbl9sb2NrX2JoKG11dGV4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNmaV9zcGluX3VubG9jayhzcGlubG9ja190ICptdXRleCkKK3sKKwlzcGluX3VubG9ja19iaChtdXRleCk7Cit9CisKK3N0cnVjdCBjZmlfZXh0cXVlcnkgKmNmaV9yZWFkX3ByaShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdWludDE2X3QgYWRyLCB1aW50MTZfdCBzaXplLAorCQkJICAgICBjb25zdCBjaGFyKiBuYW1lKTsKK3N0cnVjdCBjZmlfZml4dXAgeworCXVpbnQxNl90IG1mcjsKKwl1aW50MTZfdCBpZDsKKwl2b2lkICgqZml4dXApKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB2b2lkKiBwYXJhbSk7CisJdm9pZCogcGFyYW07Cit9OworCisjZGVmaW5lIENGSV9NRlJfQU5ZIDB4ZmZmZgorI2RlZmluZSBDRklfSURfQU5ZICAweGZmZmYKKworI2RlZmluZSBDRklfTUZSX0FNRCAweDAwMDEKKyNkZWZpbmUgQ0ZJX01GUl9TVCAgMHgwMDIwIAkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgKi8KKwordm9pZCBjZmlfZml4dXAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBjZmlfZml4dXAqIGZpeHVwcyk7CisKK3R5cGVkZWYgaW50ICgqdmFyc2l6ZV9mcm9iX3QpKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZHIsIGludCBsZW4sIHZvaWQgKnRodW5rKTsKKworaW50IGNmaV92YXJzaXplX2Zyb2Ioc3RydWN0IG10ZF9pbmZvICptdGQsIHZhcnNpemVfZnJvYl90IGZyb2IsCisJbG9mZl90IG9mcywgc2l6ZV90IGxlbiwgdm9pZCAqdGh1bmspOworCisKKyNlbmRpZiAvKiBfX01URF9DRklfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9jZmlfZW5kaWFuLmggYi9pbmNsdWRlL2xpbnV4L210ZC9jZmlfZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3MjRmNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2NmaV9lbmRpYW4uaApAQCAtMCwwICsxLDU3IEBACisvKgorICogJElkOiBjZmlfZW5kaWFuLmgsdiAxLjExIDIwMDIvMDEvMzAgMjM6MjA6NDggYXdvem5pYWsgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2lmbmRlZiBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUworCisjZGVmaW5lIENGSV9IT1NUX0VORElBTgorCisjZWxzZQorCisjaWZkZWYgQ09ORklHX01URF9DRklfTk9TV0FQCisjZGVmaW5lIENGSV9IT1NUX0VORElBTgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTVREX0NGSV9MRV9CWVRFX1NXQVAKKyNkZWZpbmUgQ0ZJX0xJVFRMRV9FTkRJQU4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01URF9DRklfQkVfQllURV9TV0FQCisjZGVmaW5lIENGSV9CSUdfRU5ESUFOCisjZW5kaWYKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGSV9MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBjcHVfdG9fY2ZpOCh4KSAoeCkKKyNkZWZpbmUgY2ZpOF90b19jcHUoeCkgKHgpCisjZGVmaW5lIGNwdV90b19jZmkxNih4KSBjcHVfdG9fbGUxNih4KQorI2RlZmluZSBjcHVfdG9fY2ZpMzIoeCkgY3B1X3RvX2xlMzIoeCkKKyNkZWZpbmUgY3B1X3RvX2NmaTY0KHgpIGNwdV90b19sZTY0KHgpCisjZGVmaW5lIGNmaTE2X3RvX2NwdSh4KSBsZTE2X3RvX2NwdSh4KQorI2RlZmluZSBjZmkzMl90b19jcHUoeCkgbGUzMl90b19jcHUoeCkKKyNkZWZpbmUgY2ZpNjRfdG9fY3B1KHgpIGxlNjRfdG9fY3B1KHgpCisjZWxpZiBkZWZpbmVkIChDRklfQklHX0VORElBTikKKyNkZWZpbmUgY3B1X3RvX2NmaTgoeCkgKHgpCisjZGVmaW5lIGNmaThfdG9fY3B1KHgpICh4KQorI2RlZmluZSBjcHVfdG9fY2ZpMTYoeCkgY3B1X3RvX2JlMTYoeCkKKyNkZWZpbmUgY3B1X3RvX2NmaTMyKHgpIGNwdV90b19iZTMyKHgpCisjZGVmaW5lIGNwdV90b19jZmk2NCh4KSBjcHVfdG9fYmU2NCh4KQorI2RlZmluZSBjZmkxNl90b19jcHUoeCkgYmUxNl90b19jcHUoeCkKKyNkZWZpbmUgY2ZpMzJfdG9fY3B1KHgpIGJlMzJfdG9fY3B1KHgpCisjZGVmaW5lIGNmaTY0X3RvX2NwdSh4KSBiZTY0X3RvX2NwdSh4KQorI2VsaWYgZGVmaW5lZCAoQ0ZJX0hPU1RfRU5ESUFOKQorI2RlZmluZSBjcHVfdG9fY2ZpOCh4KSAoeCkKKyNkZWZpbmUgY2ZpOF90b19jcHUoeCkgKHgpCisjZGVmaW5lIGNwdV90b19jZmkxNih4KSAoeCkKKyNkZWZpbmUgY3B1X3RvX2NmaTMyKHgpICh4KQorI2RlZmluZSBjcHVfdG9fY2ZpNjQoeCkgKHgpCisjZGVmaW5lIGNmaTE2X3RvX2NwdSh4KSAoeCkKKyNkZWZpbmUgY2ZpMzJfdG9fY3B1KHgpICh4KQorI2RlZmluZSBjZmk2NF90b19jcHUoeCkgKHgpCisjZWxzZQorI2Vycm9yIE5vIENGSSBlbmRpYW5uZXNzIGRlZmluZWQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvY29tcGF0bWFjLmggYi9pbmNsdWRlL2xpbnV4L210ZC9jb21wYXRtYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDEzMDBkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvY29tcGF0bWFjLmgKQEAgLTAsMCArMSwxMCBAQAorCisjaWZuZGVmIF9fTElOVVhfTVREX0NPTVBBVE1BQ19IX18KKyNkZWZpbmUgX19MSU5VWF9NVERfQ09NUEFUTUFDX0hfXworCisvKiBOb3RoaW5nIHRvIHNlZSBoZXJlLiBXZSB3cml0ZSAyLjUtY29tcGF0aWJsZSBjb2RlIGFuZCB0aGlzCisgICBmaWxlIG1ha2VzIGl0IGFsbCBPSyBpbiBvbGRlciBrZXJuZWxzLCBidXQgaXQncyBlbXB0eSBpbiBfY3VycmVudF8KKyAgIGtlcm5lbHMuIEluY2x1ZGUgZ3VhcmQganVzdCB0byBtYWtlIEdDQyBpZ25vcmUgaXQgaW4gZnV0dXJlIGluY2x1c2lvbnMKKyAgIGFueXdheS4uLiAqLworCisjZW5kaWYgLyogX19MSU5VWF9NVERfQ09NUEFUTUFDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvY29uY2F0LmggYi9pbmNsdWRlL2xpbnV4L210ZC9jb25jYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDhkYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvY29uY2F0LmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIE1URCBkZXZpY2UgY29uY2F0ZW5hdGlvbiBsYXllciBkZWZpbml0aW9ucworICoKKyAqIChDKSAyMDAyIFJvYmVydCBLYWlzZXIgPHJrYWlzZXJAc3lzZ28uZGU+CisgKgorICogVGhpcyBjb2RlIGlzIEdQTAorICoKKyAqICRJZDogY29uY2F0LmgsdiAxLjEgMjAwMi8wMy8wOCAxNjozNDozNiBya2Fpc2VyIEV4cCAkCisgKi8KKworI2lmbmRlZiBNVERfQ09OQ0FUX0gKKyNkZWZpbmUgTVREX0NPTkNBVF9ICisKKworc3RydWN0IG10ZF9pbmZvICptdGRfY29uY2F0X2NyZWF0ZSgKKyAgICBzdHJ1Y3QgbXRkX2luZm8gKnN1YmRldltdLCAgLyogc3ViZGV2aWNlcyB0byBjb25jYXRlbmF0ZSAqLworICAgIGludCBudW1fZGV2cywgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3ViZGV2aWNlcyAgICAgICovCisgICAgY2hhciAqbmFtZSk7ICAgICAgICAgICAgICAgIC8qIG5hbWUgZm9yIHRoZSBuZXcgZGV2aWNlICAgKi8KKwordm9pZCBtdGRfY29uY2F0X2Rlc3Ryb3koc3RydWN0IG10ZF9pbmZvICptdGQpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvZG9jMjAwMC5oIGIvaW5jbHVkZS9saW51eC9tdGQvZG9jMjAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1M2U2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9kb2MyMDAwLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qIAorICogTGludXggZHJpdmVyIGZvciBEaXNrLU9uLUNoaXAgZGV2aWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBNYWNoaW5lIFZpc2lvbiBIb2xkaW5ncywgSW5jLiAgIAorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgR3JlZyBVbmdlcmVyIDxnZXJnQHNuYXBnZWFyLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIFNuYXBHZWFyIEluYworICoKKyAqICRJZDogZG9jMjAwMC5oLHYgMS4yNCAyMDA1LzAxLzA1IDEyOjQwOjM4IGR3bXcyIEV4cCAkIAorICoKKyAqIFJlbGVhc2VkIHVuZGVyIEdQTAorICovCisKKyNpZm5kZWYgX19NVERfRE9DMjAwMF9IX18KKyNkZWZpbmUgX19NVERfRE9DMjAwMF9IX18KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNkZWZpbmUgRG9DX1NpZzEgMAorI2RlZmluZSBEb0NfU2lnMiAxCisKKyNkZWZpbmUgRG9DX0NoaXBJRAkJMHgxMDAwCisjZGVmaW5lIERvQ19ET0NTdGF0dXMJCTB4MTAwMQorI2RlZmluZSBEb0NfRE9DQ29udHJvbAkJMHgxMDAyCisjZGVmaW5lIERvQ19GbG9vclNlbGVjdAkJMHgxMDAzCisjZGVmaW5lIERvQ19DRFNOQ29udHJvbAkJMHgxMDA0CisjZGVmaW5lIERvQ19DRFNORGV2aWNlU2VsZWN0IAkweDEwMDUKKyNkZWZpbmUgRG9DX0VDQ0NvbmYgCQkweDEwMDYKKyNkZWZpbmUgRG9DXzJrX0VDQ1N0YXR1cwkweDEwMDcKKworI2RlZmluZSBEb0NfQ0RTTlNsb3dJTwkJMHgxMDBkCisjZGVmaW5lIERvQ19FQ0NTeW5kcm9tZTAJMHgxMDEwCisjZGVmaW5lIERvQ19FQ0NTeW5kcm9tZTEJMHgxMDExCisjZGVmaW5lIERvQ19FQ0NTeW5kcm9tZTIJMHgxMDEyCisjZGVmaW5lIERvQ19FQ0NTeW5kcm9tZTMJMHgxMDEzCisjZGVmaW5lIERvQ19FQ0NTeW5kcm9tZTQJMHgxMDE0CisjZGVmaW5lIERvQ19FQ0NTeW5kcm9tZTUJMHgxMDE1CisjZGVmaW5lIERvQ19BbGlhc1Jlc29sdXRpb24gCTB4MTAxYgorI2RlZmluZSBEb0NfQ29uZmlnSW5wdXQJCTB4MTAxYworI2RlZmluZSBEb0NfUmVhZFBpcGVJbml0IAkweDEwMWQKKyNkZWZpbmUgRG9DX1dyaXRlUGlwZVRlcm0gCTB4MTAxZQorI2RlZmluZSBEb0NfTGFzdERhdGFSZWFkIAkweDEwMWYKKyNkZWZpbmUgRG9DX05PUCAJCTB4MTAyMAorCisjZGVmaW5lIERvQ19NaWxfQ0RTTl9JTyAJMHgwODAwCisjZGVmaW5lIERvQ18ya19DRFNOX0lPIAkJMHgxODAwCisKKyNkZWZpbmUgRG9DX01wbHVzX05PUAkJCTB4MTAwMgorI2RlZmluZSBEb0NfTXBsdXNfQWxpYXNSZXNvbHV0aW9uCTB4MTAwNAorI2RlZmluZSBEb0NfTXBsdXNfRE9DQ29udHJvbAkJMHgxMDA2CisjZGVmaW5lIERvQ19NcGx1c19BY2Nlc3NTdGF0dXMJCTB4MTAwOAorI2RlZmluZSBEb0NfTXBsdXNfRGV2aWNlU2VsZWN0CQkweDEwMDgKKyNkZWZpbmUgRG9DX01wbHVzX0NvbmZpZ3VyYXRpb24JCTB4MTAwYQorI2RlZmluZSBEb0NfTXBsdXNfT3V0cHV0Q29udHJvbAkJMHgxMDBjCisjZGVmaW5lIERvQ19NcGx1c19GbGFzaENvbnRyb2wJCTB4MTAyMAorI2RlZmluZSBEb0NfTXBsdXNfRmxhc2hTZWxlY3QgCQkweDEwMjIKKyNkZWZpbmUgRG9DX01wbHVzX0ZsYXNoQ21kCQkweDEwMjQKKyNkZWZpbmUgRG9DX01wbHVzX0ZsYXNoQWRkcmVzcwkJMHgxMDI2CisjZGVmaW5lIERvQ19NcGx1c19GbGFzaERhdGEwCQkweDEwMjgKKyNkZWZpbmUgRG9DX01wbHVzX0ZsYXNoRGF0YTEJCTB4MTAyOQorI2RlZmluZSBEb0NfTXBsdXNfUmVhZFBpcGVJbml0CQkweDEwMmEKKyNkZWZpbmUgRG9DX01wbHVzX0xhc3REYXRhUmVhZAkJMHgxMDJjCisjZGVmaW5lIERvQ19NcGx1c19MYXN0RGF0YVJlYWQxCQkweDEwMmQKKyNkZWZpbmUgRG9DX01wbHVzX1dyaXRlUGlwZVRlcm0gCTB4MTAyZQorI2RlZmluZSBEb0NfTXBsdXNfRUNDU3luZHJvbWUwCQkweDEwNDAKKyNkZWZpbmUgRG9DX01wbHVzX0VDQ1N5bmRyb21lMQkJMHgxMDQxCisjZGVmaW5lIERvQ19NcGx1c19FQ0NTeW5kcm9tZTIJCTB4MTA0MgorI2RlZmluZSBEb0NfTXBsdXNfRUNDU3luZHJvbWUzCQkweDEwNDMKKyNkZWZpbmUgRG9DX01wbHVzX0VDQ1N5bmRyb21lNAkJMHgxMDQ0CisjZGVmaW5lIERvQ19NcGx1c19FQ0NTeW5kcm9tZTUJCTB4MTA0NQorI2RlZmluZSBEb0NfTXBsdXNfRUNDQ29uZiAJCTB4MTA0NgorI2RlZmluZSBEb0NfTXBsdXNfVG9nZ2xlCQkweDEwNDYKKyNkZWZpbmUgRG9DX01wbHVzX0Rvd25sb2FkU3RhdHVzCTB4MTA3NAorI2RlZmluZSBEb0NfTXBsdXNfQ3RybENvbmZpcm0JCTB4MTA3NgorI2RlZmluZSBEb0NfTXBsdXNfUG93ZXIJCQkweDFmZmYKKworLyogSG93IHRvIGFjY2VzcyB0aGUgZGV2aWNlPyAKKyAqIE9uIEFSTSwgaXQnbGwgYmUgbW1hcCdkIGRpcmVjdGx5IHdpdGggMzItYml0IHdpZGUgYWNjZXNzZXMuIAorICogT24gUFBDLCBpdCdzIG1tYXAnZCBhbmQgMTYtYml0IHdpZGUuCisgKiBPdGhlcnMgdXNlIHJlYWRiL3dyaXRlYiAKKyAqLworI2lmIGRlZmluZWQoX19hcm1fXykKKyNkZWZpbmUgUmVhZERPQ18oYWRyLCByZWcpICAgICAgKCh1bnNpZ25lZCBjaGFyKSgqKHZvbGF0aWxlIF9fdTMyICopKCgodW5zaWduZWQgbG9uZylhZHIpKygocmVnKTw8MikpKSkKKyNkZWZpbmUgV3JpdGVET0NfKGQsIGFkciwgcmVnKSAgZG97ICoodm9sYXRpbGUgX191MzIgKikoKCh1bnNpZ25lZCBsb25nKWFkcikrKChyZWcpPDwyKSkgPSAoX191MzIpZDsgd21iKCk7fSB3aGlsZSgwKQorI2RlZmluZSBET0NfSU9SRU1BUF9MRU4gMHg4MDAwCisjZWxpZiBkZWZpbmVkKF9fcHBjX18pCisjZGVmaW5lIFJlYWRET0NfKGFkciwgcmVnKSAgICAgICgodW5zaWduZWQgY2hhcikoKih2b2xhdGlsZSBfX3UxNiAqKSgoKHVuc2lnbmVkIGxvbmcpYWRyKSsoKHJlZyk8PDEpKSkpCisjZGVmaW5lIFdyaXRlRE9DXyhkLCBhZHIsIHJlZykgIGRveyAqKHZvbGF0aWxlIF9fdTE2ICopKCgodW5zaWduZWQgbG9uZylhZHIpKygocmVnKTw8MSkpID0gKF9fdTE2KWQ7IHdtYigpO30gd2hpbGUoMCkKKyNkZWZpbmUgRE9DX0lPUkVNQVBfTEVOIDB4NDAwMAorI2Vsc2UKKyNkZWZpbmUgUmVhZERPQ18oYWRyLCByZWcpICAgICAgcmVhZGIoKHZvaWQgX19pb21lbSAqKShhZHIpICsgKHJlZykpCisjZGVmaW5lIFdyaXRlRE9DXyhkLCBhZHIsIHJlZykgIHdyaXRlYihkLCAodm9pZCBfX2lvbWVtICopKGFkcikgKyAocmVnKSkKKyNkZWZpbmUgRE9DX0lPUkVNQVBfTEVOIDB4MjAwMAorCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKyNkZWZpbmUgVVNFX01FTUNQWQorI2VuZGlmCisKKy8qIFRoZXNlIGFyZSBwcm92aWRlZCB0byBkaXJlY3RseSB1c2UgdGhlIERvQ194eHggZGVmaW5lcyAqLworI2RlZmluZSBSZWFkRE9DKGFkciwgcmVnKSAgICAgIFJlYWRET0NfKGFkcixEb0NfIyNyZWcpCisjZGVmaW5lIFdyaXRlRE9DKGQsIGFkciwgcmVnKSAgV3JpdGVET0NfKGQsYWRyLERvQ18jI3JlZykKKworI2RlZmluZSBET0NfTU9ERV9SRVNFVCAJCTAKKyNkZWZpbmUgRE9DX01PREVfTk9STUFMIAkxCisjZGVmaW5lIERPQ19NT0RFX1JFU0VSVkVEMSAJMgorI2RlZmluZSBET0NfTU9ERV9SRVNFUlZFRDIgCTMKKworI2RlZmluZSBET0NfTU9ERV9DTFJfRVJSIAkweDgwCisjZGVmaW5lCURPQ19NT0RFX1JTVF9MQVQJMHgxMAorI2RlZmluZQlET0NfTU9ERV9CREVDVAkJMHgwOAorI2RlZmluZSBET0NfTU9ERV9NRFdSRU4gCTB4MDQKKworI2RlZmluZSBET0NfQ2hpcElEX0RvYzJrIAkweDIwCisjZGVmaW5lIERPQ19DaGlwSURfRG9jMmtUU09QIAkweDIxCS8qIGludGVybmFsIG51bWJlciBmb3IgTVREICovCisjZGVmaW5lIERPQ19DaGlwSURfRG9jTWlsIAkweDMwCisjZGVmaW5lIERPQ19DaGlwSURfRG9jTWlsUGx1czMyCTB4NDAKKyNkZWZpbmUgRE9DX0NoaXBJRF9Eb2NNaWxQbHVzMTYJMHg0MQorCisjZGVmaW5lIENEU05fQ1RSTF9GUl9CIAkJMHg4MAorI2RlZmluZSBDRFNOX0NUUkxfRlJfQjAJCTB4NDAKKyNkZWZpbmUgQ0RTTl9DVFJMX0ZSX0IxCQkweDgwCisKKyNkZWZpbmUgQ0RTTl9DVFJMX0VDQ19JTyAJMHgyMAorI2RlZmluZSBDRFNOX0NUUkxfRkxBU0hfSU8gCTB4MTAKKyNkZWZpbmUgQ0RTTl9DVFJMX1dQIAkJMHgwOAorI2RlZmluZSBDRFNOX0NUUkxfQUxFIAkJMHgwNAorI2RlZmluZSBDRFNOX0NUUkxfQ0xFIAkJMHgwMgorI2RlZmluZSBDRFNOX0NUUkxfQ0UgCQkweDAxCisKKyNkZWZpbmUgRE9DX0VDQ19SRVNFVCAJCTAKKyNkZWZpbmUgRE9DX0VDQ19FUlJPUiAJCTB4ODAKKyNkZWZpbmUgRE9DX0VDQ19SVyAJCTB4MjAKKyNkZWZpbmUgRE9DX0VDQ19fRU4gCQkweDA4CisjZGVmaW5lIERPQ19UT0dHTEVfQklUIAkJMHgwNAorI2RlZmluZSBET0NfRUNDX1JFU1YgCQkweDAyCisjZGVmaW5lIERPQ19FQ0NfSUdOT1JFCQkweDAxCisKKyNkZWZpbmUgRE9DX0ZMQVNIX0NFCQkweDgwCisjZGVmaW5lIERPQ19GTEFTSF9XUAkJMHg0MAorI2RlZmluZSBET0NfRkxBU0hfQkFOSwkJMHgwMgorCisvKiBXZSBoYXZlIHRvIGFsc28gc2V0IHRoZSByZXNlcnZlZCBiaXQgMSBmb3IgZW5hYmxlICovCisjZGVmaW5lIERPQ19FQ0NfRU4gKERPQ19FQ0NfX0VOIHwgRE9DX0VDQ19SRVNWKQorI2RlZmluZSBET0NfRUNDX0RJUyAoRE9DX0VDQ19SRVNWKQorCitzdHJ1Y3QgTmFuZCB7CisJY2hhciBmbG9vciwgY2hpcDsKKwl1bnNpZ25lZCBsb25nIGN1cmFkcjsKKwl1bnNpZ25lZCBjaGFyIGN1cm1vZGU7CisJLyogQWxzbyBzb21lIGVyYXNlL3dyaXRlL3BpcGVsaW5lIGluZm8gd2hlbiB3ZSBnZXQgdGhhdCBmYXIgKi8KK307CisKKyNkZWZpbmUgTUFYX0ZMT09SUyA0CisjZGVmaW5lIE1BWF9DSElQUyA0CisKKyNkZWZpbmUgTUFYX0ZMT09SU19NSUwgMQorI2RlZmluZSBNQVhfQ0hJUFNfTUlMIDEKKworI2RlZmluZSBNQVhfRkxPT1JTX01QTFVTIDIKKyNkZWZpbmUgTUFYX0NISVBTX01QTFVTIDEKKworI2RlZmluZSBBRERSX0NPTFVNTiAxCisjZGVmaW5lIEFERFJfUEFHRSAyCisjZGVmaW5lIEFERFJfQ09MVU1OX1BBR0UgMworCitzdHJ1Y3QgRGlza09uQ2hpcCB7CisJdW5zaWduZWQgbG9uZyBwaHlzYWRyOworCXZvaWQgX19pb21lbSAqdmlydGFkcjsKKwl1bnNpZ25lZCBsb25nIHRvdGxlbjsKKwl1bnNpZ25lZCBjaGFyIENoaXBJRDsgLyogVHlwZSBvZiBEaXNrT25DaGlwICovCisJaW50IGlvcmVnOworCQorCXVuc2lnbmVkIGxvbmcgbWZyOyAvKiBGbGFzaCBJRHMgLSBvbmx5IG9uZSB0eXBlIG9mIGZsYXNoIHBlciBkZXZpY2UgKi8KKwl1bnNpZ25lZCBsb25nIGlkOworCWludCBjaGlwc2hpZnQ7CisJY2hhciBwYWdlMjU2OworCWNoYXIgcGFnZWFkcmxlbjsKKwljaGFyIGludGVybGVhdmU7IC8qIEludGVybmFsIGludGVybGVhdmluZyAtIE1pbGxlbm5pdW0gUGx1cyBzdHlsZSAqLworCXVuc2lnbmVkIGxvbmcgZXJhc2VzaXplOworCQorCWludCBjdXJmbG9vcjsKKwlpbnQgY3VyY2hpcDsKKwkKKwlpbnQgbnVtY2hpcHM7CisJc3RydWN0IE5hbmQgKmNoaXBzOworCXN0cnVjdCBtdGRfaW5mbyAqbmV4dGRvYzsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7Cit9OworCitpbnQgZG9jX2RlY29kZV9lY2ModW5zaWduZWQgY2hhciBzZWN0b3JbNTEyXSwgdW5zaWduZWQgY2hhciBlY2MxWzZdKTsKKworI2VuZGlmIC8qIF9fTVREX0RPQzIwMDBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9mbGFzaGNoaXAuaCBiL2luY2x1ZGUvbGludXgvbXRkL2ZsYXNoY2hpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NmJhODEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9mbGFzaGNoaXAuaApAQCAtMCwwICsxLDg5IEBACisKKy8qIAorICogc3RydWN0IGZsY2hpcCBkZWZpbml0aW9uCisgKiAKKyAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBhbmQgc3RhdGUgb2YgYSBnaXZlbiBmbGFzaCBkZXZpY2UgCisgKgorICogKEMpIDIwMDAgUmVkIEhhdC4gR1BMZC4KKyAqCisgKiAkSWQ6IGZsYXNoY2hpcC5oLHYgMS4xNSAyMDA0LzExLzA1IDIyOjQxOjA2IG5pY28gRXhwICQKKyAqCisgKi8KKworI2lmbmRlZiBfX01URF9GTEFTSENISVBfSF9fCisjZGVmaW5lIF9fTVREX0ZMQVNIQ0hJUF9IX18KKworLyogRm9yIHNwaW5sb2Nrcy4gc2NoZWQuaCBpbmNsdWRlcyBzcGlubG9jay5oIGZyb20gd2hpY2hldmVyIGRpcmVjdG9yeSBpdAorICogaGFwcGVucyB0byBiZSBpbiAtIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FyZSB3aGV0aGVyIHdlJ3JlIG9uIDIuMiwgd2hpY2gKKyAqIGhhcyBhc20vc3BpbmxvY2suaCwgb3IgMi40LCB3aGljaCBoYXMgbGludXgvc3BpbmxvY2suaCAKKyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKK3R5cGVkZWYgZW51bSB7IAorCUZMX1JFQURZLAorCUZMX1NUQVRVUywKKwlGTF9DRklfUVVFUlksCisJRkxfSkVERUNfUVVFUlksCisJRkxfRVJBU0lORywKKwlGTF9FUkFTRV9TVVNQRU5ESU5HLAorCUZMX0VSQVNFX1NVU1BFTkRFRCwKKwlGTF9XUklUSU5HLAorCUZMX1dSSVRJTkdfVE9fQlVGRkVSLAorCUZMX1dSSVRFX1NVU1BFTkRJTkcsCisJRkxfV1JJVEVfU1VTUEVOREVELAorCUZMX1BNX1NVU1BFTkRFRCwKKwlGTF9TWU5DSU5HLAorCUZMX1VOTE9BRElORywKKwlGTF9MT0NLSU5HLAorCUZMX1VOTE9DS0lORywKKwlGTF9QT0lOVCwKKwlGTF9YSVBfV0hJTEVfRVJBU0lORywKKwlGTF9YSVBfV0hJTEVfV1JJVElORywKKwlGTF9VTktOT1dOCit9IGZsc3RhdGVfdDsKKworCisKKy8qIE5PVEU6IGNvbmZ1c2luZ2x5LCB0aGlzIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIG1vcmUgdGhhbiBvbmUgY2hpcCBhdCBhIHRpbWUsIAorICAgaWYgdGhleSdyZSBpbnRlcmxlYXZlZC4gIFRoaXMgY2FuIGV2ZW4gcmVmZXIgdG8gaW5kaXZpZHVhbCBwYXJ0aXRpb25zIG9uCisgICB0aGUgc2FtZSBwaHlzaWNhbCBjaGlwIHdoZW4gcHJlc2VudC4gKi8KKworc3RydWN0IGZsY2hpcCB7CisJdW5zaWduZWQgbG9uZyBzdGFydDsgLyogT2Zmc2V0IHdpdGhpbiB0aGUgbWFwICovCisJLy8JdW5zaWduZWQgbG9uZyBsZW47CisJLyogV2Ugb21pdCBsZW4gZm9yIG5vdywgYmVjYXVzZSB3aGVuIHdlIGdyb3VwIHRoZW0gdG9nZXRoZXIKKwkgICB3ZSBpbnNpc3QgdGhhdCB0aGV5J3JlIGFsbCBvZiB0aGUgc2FtZSBzaXplLCBhbmQgdGhlIGNoaXAgc2l6ZQorCSAgIGlzIGhlbGQgaW4gdGhlIG5leHQgbGV2ZWwgdXAuIElmIHdlIGdldCBtb3JlIHZlcnNhdGlsZSBsYXRlciwKKwkgICBpdCdsbCBtYWtlIGl0IGEgZGFtbiBzaWdodCBoYXJkZXIgdG8gZmluZCB3aGljaCBjaGlwIHdlIHdhbnQgZnJvbQorCSAgIGEgZ2l2ZW4gb2Zmc2V0LCBhbmQgd2UnbGwgd2FudCB0byBhZGQgdGhlIHBlci1jaGlwIGxlbmd0aCBmaWVsZAorCSAgIGJhY2sgaW4uCisJKi8KKwlpbnQgcmVmX3BvaW50X2NvdW50ZXI7CisJZmxzdGF0ZV90IHN0YXRlOworCWZsc3RhdGVfdCBvbGRzdGF0ZTsKKworCWludCB3cml0ZV9zdXNwZW5kZWQ6MTsKKwlpbnQgZXJhc2Vfc3VzcGVuZGVkOjE7CisJdW5zaWduZWQgbG9uZyBpbl9wcm9ncmVzc19ibG9ja19hZGRyOworCisJc3BpbmxvY2tfdCAqbXV0ZXg7CisJc3BpbmxvY2tfdCBfc3BpbmxvY2s7IC8qIFdlIGRvIGl0IGxpa2UgdGhpcyBiZWNhdXNlIHNvbWV0aW1lcyB0aGV5J2xsIGJlIHNoYXJlZC4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsgLyogV2FpdCBvbiBoZXJlIHdoZW4gd2UncmUgd2FpdGluZyBmb3IgdGhlIGNoaXAKKwkJCSAgICAgdG8gYmUgcmVhZHkgKi8KKwlpbnQgd29yZF93cml0ZV90aW1lOworCWludCBidWZmZXJfd3JpdGVfdGltZTsKKwlpbnQgZXJhc2VfdGltZTsKKworCXZvaWQgKnByaXY7Cit9OworCisvKiBUaGlzIGlzIHVzZWQgdG8gaGFuZGxlIGNvbnRlbnRpb24gb24gd3JpdGUvZXJhc2Ugb3BlcmF0aW9ucworICAgYmV0d2VlbiBwYXJ0aXRpb25zIG9mIHRoZSBzYW1lIHBoeXNpY2FsIGNoaXAuICovCitzdHJ1Y3QgZmxjaGlwX3NoYXJlZCB7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBmbGNoaXAgKndyaXRpbmc7CisJc3RydWN0IGZsY2hpcCAqZXJhc2luZzsKK307CisKKworI2VuZGlmIC8qIF9fTVREX0ZMQVNIQ0hJUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL2Z0bC5oIGIvaW5jbHVkZS9saW51eC9tdGQvZnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3ODQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2Z0bC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiAkSWQ6IGZ0bC5oLHYgMS42IDIwMDMvMDEvMjQgMTM6MjA6MDQgZHdtdzIgRXhwICQKKyAqIAorICogRGVyaXZlZCBmcm9tIChhbmQgcHJvYmFibHkgaWRlbnRpY2FsIHRvKToKKyAqIGZ0bC5oIDEuNyAxOTk5LzEwLzI1IDIwOjIzOjE3CisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorICogY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKKyAqIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUKKyAqIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAKKyAqCisgKiBUaGUgaW5pdGlhbCBkZXZlbG9wZXIgb2YgdGhlIG9yaWdpbmFsIGNvZGUgaXMgRGF2aWQgQS4gSGluZHMKKyAqIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCisgKiBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQorICogYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCisgKiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkKKyAqIGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZAorICogb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlCisgKiBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCisgKi8KKworI2lmbmRlZiBfTElOVVhfRlRMX0gKKyNkZWZpbmUgX0xJTlVYX0ZUTF9ICisKK3R5cGVkZWYgc3RydWN0IGVyYXNlX3VuaXRfaGVhZGVyX3QgeworICAgIHVfaW50OF90CUxpbmtUYXJnZXRUdXBsZVs1XTsKKyAgICB1X2ludDhfdAlEYXRhT3JnVHVwbGVbMTBdOworICAgIHVfaW50OF90CU51bVRyYW5zZmVyVW5pdHM7CisgICAgdV9pbnQzMl90CUVyYXNlQ291bnQ7CisgICAgdV9pbnQxNl90CUxvZ2ljYWxFVU47CisgICAgdV9pbnQ4X3QJQmxvY2tTaXplOworICAgIHVfaW50OF90CUVyYXNlVW5pdFNpemU7CisgICAgdV9pbnQxNl90CUZpcnN0UGh5c2ljYWxFVU47CisgICAgdV9pbnQxNl90CU51bUVyYXNlVW5pdHM7CisgICAgdV9pbnQzMl90CUZvcm1hdHRlZFNpemU7CisgICAgdV9pbnQzMl90CUZpcnN0Vk1BZGRyZXNzOworICAgIHVfaW50MTZfdAlOdW1WTVBhZ2VzOworICAgIHVfaW50OF90CUZsYWdzOworICAgIHVfaW50OF90CUNvZGU7CisgICAgdV9pbnQzMl90CVNlcmlhbE51bWJlcjsKKyAgICB1X2ludDMyX3QJQWx0RVVIT2Zmc2V0OworICAgIHVfaW50MzJfdAlCQU1PZmZzZXQ7CisgICAgdV9pbnQ4X3QJUmVzZXJ2ZWRbMTJdOworICAgIHVfaW50OF90CUVuZFR1cGxlWzJdOworfSBlcmFzZV91bml0X2hlYWRlcl90OworCisvKiBGbGFncyBpbiBlcmFzZV91bml0X2hlYWRlcl90ICovCisjZGVmaW5lIEhJRERFTl9BUkVBCQkweDAxCisjZGVmaW5lIFJFVkVSU0VfUE9MQVJJVFkJMHgwMgorI2RlZmluZSBET1VCTEVfQkFJCQkweDA0CisKKy8qIERlZmluaXRpb25zIGZvciBibG9jayBhbGxvY2F0aW9uIGluZm9ybWF0aW9uICovCisKKyNkZWZpbmUgQkxPQ0tfRlJFRShiKQkJKChiKSA9PSAweGZmZmZmZmZmKQorI2RlZmluZSBCTE9DS19ERUxFVEVEKGIpCSgoKGIpID09IDApIHx8ICgoYikgPT0gMHhmZmZmZmZmZSkpCisKKyNkZWZpbmUgQkxPQ0tfVFlQRShiKQkJKChiKSAmIDB4N2YpCisjZGVmaW5lIEJMT0NLX0FERFJFU1MoYikJKChiKSAmIH4weDdmKQorI2RlZmluZSBCTE9DS19OVU1CRVIoYikJCSgoYikgPj4gOSkKKyNkZWZpbmUgQkxPQ0tfQ09OVFJPTAkJMHgzMAorI2RlZmluZSBCTE9DS19EQVRBCQkweDQwCisjZGVmaW5lIEJMT0NLX1JFUExBQ0VNRU5UCTB4NjAKKyNkZWZpbmUgQkxPQ0tfQkFECQkweDcwCisKKyNlbmRpZiAvKiBfTElOVVhfRlRMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL2dlbl9wcm9iZS5oIGIvaW5jbHVkZS9saW51eC9tdGQvZ2VuX3Byb2JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3YmRlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2dlbl9wcm9iZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiAoQykgMjAwMSwgMjAwMSBSZWQgSGF0LCBJbmMuCisgKiBHUEwnZAorICogJElkOiBnZW5fcHJvYmUuaCx2IDEuMyAyMDA0LzEwLzIwIDIyOjEwOjMzIGR3bXcyIEV4cCAkCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01URF9HRU5fUFJPQkVfSF9fCisjZGVmaW5lIF9fTElOVVhfTVREX0dFTl9QUk9CRV9IX18KKworI2luY2x1ZGUgPGxpbnV4L210ZC9mbGFzaGNoaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+IAorI2luY2x1ZGUgPGxpbnV4L210ZC9jZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworc3RydWN0IGNoaXBfcHJvYmUgeworCWNoYXIgKm5hbWU7CisJaW50ICgqcHJvYmVfY2hpcCkoc3RydWN0IG1hcF9pbmZvICptYXAsIF9fdTMyIGJhc2UsCisJCQkgIHVuc2lnbmVkIGxvbmcgKmNoaXBfbWFwLCBzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSk7Cit9OworCitzdHJ1Y3QgbXRkX2luZm8gKm10ZF9kb19jaGlwX3Byb2JlKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgY2hpcF9wcm9iZSAqY3ApOworCisjZW5kaWYgLyogX19MSU5VWF9NVERfR0VOX1BST0JFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvaWZsYXNoLmggYi9pbmNsdWRlL2xpbnV4L210ZC9pZmxhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWE1YjRmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvaWZsYXNoLmgKQEAgLTAsMCArMSw5OCBAQAorLyogJElkOiBpZmxhc2guaCx2IDEuMiAyMDAwLzExLzEzIDE4OjAxOjU0IGR3bXcyIEV4cCAkICovCisKKyNpZm5kZWYgX19NVERfSUZMQVNIX0hfXworI2RlZmluZSBfX01URF9JRkxBU0hfSF9fCisKKy8qIEV4dGVuZGVkIENJUyByZWdpc3RlcnMgZm9yIFNlcmllcyAyIGFuZCAyKyBjYXJkcyAqLworLyogVGhlIHJlZ2lzdGVycyBhcmUgYWxsIG9mZnNldHMgZnJvbSAweDQwMDAgKi8KKyNkZWZpbmUgQ0lTUkVHX0NTUgkJMHgwMTAwCisjZGVmaW5lIENJU1JFR19XUAkJMHgwMTA0CisjZGVmaW5lIENJU1JFR19SRFlCU1kJCTB4MDE0MAorCisvKiBFeHRlbmRlZCBDSVMgcmVnaXN0ZXJzIGZvciBTZXJpZXMgMiBjYXJkcyAqLworI2RlZmluZSBDSVNSRUdfU0xFRVAJCTB4MDExOAorI2RlZmluZSBDSVNSRUdfUkRZX01BU0sJCTB4MDEyMAorI2RlZmluZSBDSVNSRUdfUkRZX1NUQVRVUwkweDAxMzAKKworLyogRXh0ZW5kZWQgQ0lTIHJlZ2lzdGVycyBmb3IgU2VyaWVzIDIrIGNhcmRzICovCisjZGVmaW5lIENJU1JFR19WQ1IJCTB4MDEwYworCisvKiBDYXJkIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBDU1JfU1JFU0VUCQkweDIwCS8qIFNvZnQgcmVzZXQgKi8KKyNkZWZpbmUgQ1NSX0NNV1AJCTB4MTAJLyogQ29tbW9uIG1lbW9yeSB3cml0ZSBwcm90ZWN0ICovCisjZGVmaW5lIENTUl9QV1JET1dOCQkweDA4CS8qIFBvd2VyIGRvd24gc3RhdHVzICovCisjZGVmaW5lIENTUl9DSVNXUAkJMHgwNAkvKiBDb21tb24gbWVtb3J5IENJUyBXUCAqLworI2RlZmluZSBDU1JfV1AJCQkweDAyCS8qIE1lY2hhbmljYWwgd3JpdGUgcHJvdGVjdCAqLworI2RlZmluZSBDU1JfUkVBRFkJCTB4MDEJLyogUmVhZHkvYnVzeSBzdGF0dXMgKi8KKworLyogV3JpdGUgUHJvdGVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBXUF9CTEtFTgkJMHgwNAkvKiBFbmFibGUgYmxvY2sgbG9ja2luZyAqLworI2RlZmluZSBXUF9DTVdQCQkJMHgwMgkvKiBDb21tb24gbWVtb3J5IHdyaXRlIHByb3RlY3QgKi8KKyNkZWZpbmUgV1BfQ0lTV1AJCTB4MDEJLyogQ29tbW9uIG1lbW9yeSBDSVMgV1AgKi8KKworLyogVm9sdGFnZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFZDUl9WQ0NfTEVWRUwJCTB4ODAJLyogMCA9IDVWLCAxID0gMy4zViAqLworI2RlZmluZSBWQ1JfVlBQX1ZBTElECQkweDAyCS8qIFZwcCBWYWxpZCAqLworI2RlZmluZSBWQ1JfVlBQX0dFTgkJMHgwMQkvKiBJbnRlZ3JhdGVkIFZwcCBnZW5lcmF0b3IgKi8KKworLyogUmVhZHkvQnVzeSBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJEWUJTWV9SQUNLCQkweDAyCS8qIFJlYWR5IGFja25vd2xlZGdlICovCisjZGVmaW5lIFJEWUJTWV9NT0RFCQkweDAxCS8qIDEgPSBoaWdoIHBlcmZvcm1hbmNlICovCisKKyNkZWZpbmUgTE9XKHgpICgoeCkgJiAweGZmKQorCisvKiAyOEYwMDhTQS1Db21wYXRpYmxlIENvbW1hbmQgU2V0ICovCisjZGVmaW5lIElGX1JFQURfQVJSQVkJCTB4ZmZmZgorI2RlZmluZSBJRl9JTlRFTF9JRAkJMHg5MDkwCisjZGVmaW5lIElGX1JFQURfQ1NSCQkweDcwNzAKKyNkZWZpbmUgSUZfQ0xFQVJfQ1NSCQkweDUwNTAKKyNkZWZpbmUgSUZfV1JJVEUJCTB4NDA0MAorI2RlZmluZSBJRl9CTE9DS19FUkFTRQkJMHgyMDIwCisjZGVmaW5lIElGX0VSQVNFX1NVU1BFTkQJMHhiMGIwCisjZGVmaW5lIElGX0NPTkZJUk0JCTB4ZDBkMAorCisvKiAyOEYwMTZTQSBQZXJmb3JtYW5jZSBFbmhhbmNlbWVudCBDb21tYW5kcyAqLworI2RlZmluZSBJRl9SRUFEX1BBR0UJCTB4NzU3NQorI2RlZmluZSBJRl9QQUdFX1NXQVAJCTB4NzI3MgorI2RlZmluZSBJRl9TSU5HTEVfTE9BRAkJMHg3NDc0CisjZGVmaW5lIElGX1NFUV9MT0FECQkweGUwZTAKKyNkZWZpbmUgSUZfUEFHRV9XUklURQkJMHgwYzBjCisjZGVmaW5lIElGX1JEWV9NT0RFCQkweDk2OTYKKyNkZWZpbmUgSUZfUkRZX0xFVkVMCQkweDAxMDEKKyNkZWZpbmUgSUZfUkRZX1BVTFNFX1dSSVRFCTB4MDIwMgorI2RlZmluZSBJRl9SRFlfUFVMU0VfRVJBU0UJMHgwMzAzCisjZGVmaW5lIElGX1JEWV9ESVNBQkxFCQkweDA0MDQKKyNkZWZpbmUgSUZfTE9DS19CTE9DSwkJMHg3Nzc3CisjZGVmaW5lIElGX1VQTE9BRF9TVEFUVVMJMHg5Nzk3CisjZGVmaW5lIElGX1JFQURfRVNSCQkweDcxNzEKKyNkZWZpbmUgSUZfRVJBU0VfVU5MT0NLRUQJMHhhN2E3CisjZGVmaW5lIElGX1NMRUVQCQkweGYwZjAKKyNkZWZpbmUgSUZfQUJPUlQJCTB4ODA4MAorI2RlZmluZSBJRl9VUExPQURfREVWSU5GTwkweDk5OTkKKworLyogRGVmaW5pdGlvbnMgZm9yIENvbXBhdGlibGUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIENTUl9XUl9SRUFEWQkJMHg4MDgwCS8qIFdyaXRlIHN0YXRlIG1hY2hpbmUgc3RhdHVzICovCisjZGVmaW5lIENTUl9FUkFfU1VTUEVORAkJMHg0MDQwCS8qIEVyYXNlIHN1c3BlbmQgc3RhdHVzICovCisjZGVmaW5lIENTUl9FUkFfRVJSCQkweDIwMjAJLyogRXJhc2Ugc3RhdHVzICovCisjZGVmaW5lIENTUl9XUl9FUlIJCTB4MTAxMAkvKiBEYXRhIHdyaXRlIHN0YXR1cyAqLworI2RlZmluZSBDU1JfVlBQX0xPVwkJMHgwODA4CS8qIFZwcCBzdGF0dXMgKi8KKworLyogRGVmaW5pdGlvbnMgZm9yIEdsb2JhbCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgR1NSX1dSX1JFQURZCQkweDgwODAJLyogV3JpdGUgc3RhdGUgbWFjaGluZSBzdGF0dXMgKi8KKyNkZWZpbmUgR1NSX09QX1NVU1BFTkQJCTB4NDA0MAkvKiBPcGVyYXRpb24gc3VzcGVuZCBzdGF0dXMgKi8KKyNkZWZpbmUgR1NSX09QX0VSUgkJMHgyMDIwCS8qIERldmljZSBvcGVyYXRpb24gc3RhdHVzICovCisjZGVmaW5lIEdTUl9TTEVFUAkJMHgxMDEwCS8qIERldmljZSBzbGVlcCBzdGF0dXMgKi8KKyNkZWZpbmUgR1NSX1FVRVVFX0ZVTEwJCTB4MDgwOAkvKiBRdWV1ZSBzdGF0dXMgKi8KKyNkZWZpbmUgR1NSX1BBR0VfQVZBSUwJCTB4MDQwNAkvKiBQYWdlIGJ1ZmZlciBhdmFpbGFibGUgc3RhdHVzICovCisjZGVmaW5lIEdTUl9QQUdFX1JFQURZCQkweDAyMDIJLyogUGFnZSBidWZmZXIgc3RhdHVzICovCisjZGVmaW5lIEdTUl9QQUdFX1NFTEVDVAkJMHgwMTAxCS8qIFBhZ2UgYnVmZmVyIHNlbGVjdCBzdGF0dXMgKi8KKworLyogRGVmaW5pdGlvbnMgZm9yIEJsb2NrIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBCU1JfUkVBRFkJCTB4ODA4MAkvKiBCbG9jayBzdGF0dXMgKi8KKyNkZWZpbmUgQlNSX1VOTE9DSwkJMHg0MDQwCS8qIEJsb2NrIGxvY2sgc3RhdHVzICovCisjZGVmaW5lIEJTUl9GQUlMRUQJCTB4MjAyMAkvKiBCbG9jayBvcGVyYXRpb24gc3RhdHVzICovCisjZGVmaW5lIEJTUl9BQk9SVEVECQkweDEwMTAJLyogT3BlcmF0aW9uIGFib3J0IHN0YXR1cyAqLworI2RlZmluZSBCU1JfUVVFVUVfRlVMTAkJMHgwODA4CS8qIFF1ZXVlIHN0YXR1cyAqLworI2RlZmluZSBCU1JfVlBQX0xPVwkJMHgwNDA0CS8qIFZwcCBzdGF0dXMgKi8KKworI2VuZGlmIC8qIF9fTVREX0lGTEFTSF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL2luZnRsLmggYi9pbmNsdWRlL2xpbnV4L210ZC9pbmZ0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MmM4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9pbmZ0bC5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKglpbmZ0bC5oIC0tIGRlZmluZXMgdG8gc3VwcG9ydCB0aGUgSW52ZXJzZSBOQU5EIEZsYXNoIFRyYW5zbGF0aW9uIExheWVyCisgKgorICoJKEMpIENvcHlyaWdodCAyMDAyLCBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQorICoKKyAqCSRJZDogaW5mdGwuaCx2IDEuNiAyMDA0LzA2LzMwIDE0OjQ5OjAwIGRicm93biBFeHAgJAorICovCisKKyNpZm5kZWYgX19NVERfSU5GVExfSF9fCisjZGVmaW5lIF9fTVREX0lORlRMX0hfXworCisjaWZuZGVmIF9fS0VSTkVMX18KKyNlcnJvciBUaGlzIGlzIGEga2VybmVsIGhlYWRlci4gUGVyaGFwcyBpbmNsdWRlIG5mdGwtdXNlci5oIGluc3RlYWQ/CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L210ZC9ibGt0cmFucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmZ0bC5oPgorCisjaW5jbHVkZSA8bXRkL2luZnRsLXVzZXIuaD4KKworI2lmbmRlZiBJTkZUTF9NQUpPUgorI2RlZmluZSBJTkZUTF9NQUpPUiA5NAorI2VuZGlmCisjZGVmaW5lIElORlRMX1BBUlROX0JJVFMgNAorCisjaWZkZWYgX19LRVJORUxfXworCitzdHJ1Y3QgSU5GVExyZWNvcmQgeworCXN0cnVjdCBtdGRfYmxrdHJhbnNfZGV2IG1iZDsKKwlfX3UxNiBNZWRpYVVuaXQ7CisJX191MzIgRXJhc2VTaXplOworCXN0cnVjdCBJTkZUTE1lZGlhSGVhZGVyIE1lZGlhSGRyOworCWludCB1c2Vjb3VudDsKKwl1bnNpZ25lZCBjaGFyIGhlYWRzOworCXVuc2lnbmVkIGNoYXIgc2VjdG9yczsKKwl1bnNpZ25lZCBzaG9ydCBjeWxpbmRlcnM7CisJX191MTYgbnVtdnVuaXRzOworCV9fdTE2IGZpcnN0RVVOOworCV9fdTE2IGxhc3RFVU47CisJX191MTYgbnVtZnJlZUVVTnM7CisJX191MTYgTGFzdEZyZWVFVU47IAkJLyogVG8gc3BlZWQgdXAgZmluZGluZyBhIGZyZWUgRVVOICovCisJaW50IGhlYWQsc2VjdCxjeWw7CisJX191MTYgKlBVdGFibGU7CSAJCS8qIFBoeXNpY2FsIFVuaXQgVGFibGUgICovCisJX191MTYgKlZVdGFibGU7IAkJLyogVmlydHVhbCBVbml0IFRhYmxlICovCisgICAgICAgIHVuc2lnbmVkIGludCBuYl9ibG9ja3M7CQkvKiBudW1iZXIgb2YgcGh5c2ljYWwgYmxvY2tzICovCisgICAgICAgIHVuc2lnbmVkIGludCBuYl9ib290X2Jsb2NrczsJLyogbnVtYmVyIG9mIGJsb2NrcyB1c2VkIGJ5IHRoZSBiaW9zICovCisgICAgICAgIHN0cnVjdCBlcmFzZV9pbmZvIGluc3RyOworICAgICAgICBzdHJ1Y3QgbmFuZF9vb2JpbmZvIG9vYmluZm87Cit9OworCitpbnQgSU5GVExfbW91bnQoc3RydWN0IElORlRMcmVjb3JkICpzKTsKK2ludCBJTkZUTF9mb3JtYXRibG9jayhzdHJ1Y3QgSU5GVExyZWNvcmQgKnMsIGludCBibG9jayk7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfX01URF9JTkZUTF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL2plZGVjLmggYi9pbmNsdWRlL2xpbnV4L210ZC9qZWRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYTBmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9qZWRlYy5oCkBAIC0wLDAgKzEsNjYgQEAKKworLyogSkVERUMgRmxhc2ggSW50ZXJmYWNlLgorICogVGhpcyBpcyBhbiBvbGRlciB0eXBlIG9mIGludGVyZmFjZSBmb3Igc2VsZiBwcm9ncmFtbWluZyBmbGFzaC4gSXQgaXMgCisgKiBjb21tb25seSB1c2UgaW4gb2xkZXIgQU1EIGNoaXBzIGFuZCBpcyBvYnNvbGV0ZSBjb21wYXJlZCB3aXRoIENGSS4KKyAqIEl0IGlzIGNhbGxlZCBKRURFQyBiZWNhdXNlIHRoZSBKRURFQyBhc3NvY2lhdGlvbiBkaXN0cmlidXRlcyB0aGUgSUQgY29kZXMKKyAqIGZvciB0aGUgY2hpcHMuCisgKgorICogU2VlIHRoZSBBTUQgZmxhc2ggZGF0YWJvb2sgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBvcGVyYXRlIHRoZSBpbnRlcmZhY2UuCisgKgorICogJElkOiBqZWRlYy5oLHYgMS4zIDIwMDMvMDUvMjEgMTE6NTE6MDEgZHdtdzIgRXhwICQKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTVREX0pFREVDX0hfXworI2RlZmluZSBfX0xJTlVYX01URF9KRURFQ19IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgTUFYX0pFREVDX0NISVBTIDE2CisKKy8vIExpc3Rpbmcgb2YgYWxsIHN1cHBvcnRlZCBjaGlwcyBhbmQgdGhlaXIgaW5mb3JtYXRpb24KK3N0cnVjdCBKRURFQ1RhYmxlCit7CisgICBfX3UxNiBqZWRlYzsKKyAgIGNoYXIgKm5hbWU7CisgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICB1bnNpZ25lZCBsb25nIHNlY3RvcnNpemU7CisgICBfX3UzMiBjYXBhYmlsaXRpZXM7Cit9OworCisvLyBKRURFQyBiZWluZyAwIGlzIHRoZSBlbmQgb2YgdGhlIGNoaXAgYXJyYXkKK3N0cnVjdCBqZWRlY19mbGFzaF9jaGlwCit7CisgICBfX3UxNiBqZWRlYzsKKyAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgIHVuc2lnbmVkIGxvbmcgc2VjdG9yc2l6ZTsKKyAgIAorICAgLy8gKihfX3U4KikoYmFzZSArIChhZGRlciA8PCBhZGRyc2hpZnQpKSA9IGRhdGEgPDwgZGF0YXNoaWZ0CisgICAvLyBBZGRyZXNzIHNpemUgPSBzaXplIDw8IGFkZHJzaGlmdAorICAgdW5zaWduZWQgbG9uZyBiYXNlOyAgICAgICAgICAgLy8gQnl0ZSAwIG9mIHRoZSBmbGFzaCwgd2lsbCBiZSB1bmFsaWduZWQKKyAgIHVuc2lnbmVkIGludCBkYXRhc2hpZnQ7ICAgICAgIC8vIFVzZWZ1bCBmb3IgMzJiaXQvMTZiaXQgYWNjZXNzZXMKKyAgIHVuc2lnbmVkIGludCBhZGRyc2hpZnQ7CisgICB1bnNpZ25lZCBsb25nIG9mZnNldDsgICAgICAgICAvLyBsaW5lcml6ZWQgc3RhcnQuIGJhc2U9PW9mZnNldCBmb3IgdW5iYW5rZWQsIHVuaW50ZXJsZWF2ZWQgZmxhc2gKKyAgIAorICAgX191MzIgY2FwYWJpbGl0aWVzOworICAgCisgICAvLyBUaGVzZSBtYXJrZXJzIGFyZSBmaWxsZWQgaW4gYnkgdGhlIGZsYXNoX2NoaXBfc2NhbiBmdW5jdGlvbgorICAgdW5zaWduZWQgbG9uZyBzdGFydDsKKyAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworfTsKKworc3RydWN0IGplZGVjX3ByaXZhdGUKK3sKKyAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsgICAgICAgICAvLyBUb3RhbCBzaXplIG9mIGFsbCB0aGUgZGV2aWNlcworICAgCisgICAvKiBCYW5rIGhhbmRsaW5nLiBJZiBzdW0oYmFua19maWxsKSA9PSBzaXplIHRoZW4gdGhpcyBpcyBsaW5lYXIgZmxhc2guCisgICAgICBPdGhlcndpc2UgdGhlIG1hcHBpbmcgaGFzIGhvbGVzIGluIGl0LiBiYW5rX2ZpbGwgbWF5IGJlIHVzZWQgdG8KKyAgICAgIGZpbmQgdGhlIGhvbGVzLCBidXQgaW4gdGhlIGNvbW1vbiBzeW1ldHJpYyBjYXNlIAorICAgICAgYmFua19maWxsWzBdID09IGJhbmtfZmlsbFsqXSwgdGh1cyBhZGRyZXNzZXMgbWF5IGJlIGNvbXB1dGVkIAorICAgICAgbWF0aG1hdGljYWxseS4gYmFua19maWxsIG11c3QgYmUgcG93ZXJzIG9mIHR3byAqLworICAgdW5zaWduZWQgaXNfYmFua2VkOworICAgdW5zaWduZWQgbG9uZyBiYW5rX2ZpbGxbTUFYX0pFREVDX0NISVBTXTsKKyAgIAorICAgc3RydWN0IGplZGVjX2ZsYXNoX2NoaXAgY2hpcHNbTUFYX0pFREVDX0NISVBTXTsgIAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9tYXAuaCBiL2luY2x1ZGUvbGludXgvbXRkL21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjY4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9tYXAuaApAQCAtMCwwICsxLDQxMiBAQAorCisvKiBPdmVyaGF1bGVkIHJvdXRpbmVzIGZvciBkZWFsaW5nIHdpdGggZGlmZmVyZW50IG1tYXAgcmVnaW9ucyBvZiBmbGFzaCAqLworLyogJElkOiBtYXAuaCx2IDEuNDYgMjAwNS8wMS8wNSAxNzowOTo0NCBkd213MiBFeHAgJCAqLworCisjaWZuZGVmIF9fTElOVVhfTVREX01BUF9IX18KKyNkZWZpbmUgX19MSU5VWF9NVERfTUFQX0hfXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL2NvbXBhdG1hYy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J1Zy5oPgorCisjaWZkZWYgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xCisjZGVmaW5lIG1hcF9iYW5rd2lkdGgobWFwKSAxCisjZGVmaW5lIG1hcF9iYW5rd2lkdGhfaXNfMShtYXApIChtYXBfYmFua3dpZHRoKG1hcCkgPT0gMSkKKyNkZWZpbmUgbWFwX2Jhbmt3aWR0aF9pc19sYXJnZShtYXApICgwKQorI2RlZmluZSBtYXBfd29yZHMobWFwKSAoMSkKKyNkZWZpbmUgTUFYX01BUF9CQU5LV0lEVEggMQorI2Vsc2UKKyNkZWZpbmUgbWFwX2Jhbmt3aWR0aF9pc18xKG1hcCkgKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMgorIyBpZmRlZiBtYXBfYmFua3dpZHRoCisjICB1bmRlZiBtYXBfYmFua3dpZHRoCisjICBkZWZpbmUgbWFwX2Jhbmt3aWR0aChtYXApICgobWFwKS0+YmFua3dpZHRoKQorIyBlbHNlCisjICBkZWZpbmUgbWFwX2Jhbmt3aWR0aChtYXApIDIKKyMgIGRlZmluZSBtYXBfYmFua3dpZHRoX2lzX2xhcmdlKG1hcCkgKDApCisjICBkZWZpbmUgbWFwX3dvcmRzKG1hcCkgKDEpCisjIGVuZGlmCisjZGVmaW5lIG1hcF9iYW5rd2lkdGhfaXNfMihtYXApIChtYXBfYmFua3dpZHRoKG1hcCkgPT0gMikKKyN1bmRlZiBNQVhfTUFQX0JBTktXSURUSAorI2RlZmluZSBNQVhfTUFQX0JBTktXSURUSCAyCisjZWxzZQorI2RlZmluZSBtYXBfYmFua3dpZHRoX2lzXzIobWFwKSAoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80CisjIGlmZGVmIG1hcF9iYW5rd2lkdGgKKyMgIHVuZGVmIG1hcF9iYW5rd2lkdGgKKyMgIGRlZmluZSBtYXBfYmFua3dpZHRoKG1hcCkgKChtYXApLT5iYW5rd2lkdGgpCisjIGVsc2UKKyMgIGRlZmluZSBtYXBfYmFua3dpZHRoKG1hcCkgNAorIyAgZGVmaW5lIG1hcF9iYW5rd2lkdGhfaXNfbGFyZ2UobWFwKSAoMCkKKyMgIGRlZmluZSBtYXBfd29yZHMobWFwKSAoMSkKKyMgZW5kaWYKKyNkZWZpbmUgbWFwX2Jhbmt3aWR0aF9pc180KG1hcCkgKG1hcF9iYW5rd2lkdGgobWFwKSA9PSA0KQorI3VuZGVmIE1BWF9NQVBfQkFOS1dJRFRICisjZGVmaW5lIE1BWF9NQVBfQkFOS1dJRFRIIDQKKyNlbHNlCisjZGVmaW5lIG1hcF9iYW5rd2lkdGhfaXNfNChtYXApICgwKQorI2VuZGlmCisKKy8qIGVuc3VyZSB3ZSBuZXZlciBldmFsdWF0ZSBhbnl0aGluZyBzaG9ydGVkIHRoYW4gYW4gdW5zaWduZWQgbG9uZworICogdG8gemVybywgYW5kIGVuc3VyZSB3ZSdsbCBuZXZlciBtaXNzIHRoZSBlbmQgb2YgYW4gY29tcGFyaXNvbiAoYmpkKSAqLworCisjZGVmaW5lIG1hcF9jYWxjX3dvcmRzKG1hcCkgKChtYXBfYmFua3dpZHRoKG1hcCkgKyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLTEpKS8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCisjaWZkZWYgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84CisjIGlmZGVmIG1hcF9iYW5rd2lkdGgKKyMgIHVuZGVmIG1hcF9iYW5rd2lkdGgKKyMgIGRlZmluZSBtYXBfYmFua3dpZHRoKG1hcCkgKChtYXApLT5iYW5rd2lkdGgpCisjICBpZiBCSVRTX1BFUl9MT05HIDwgNjQKKyMgICB1bmRlZiBtYXBfYmFua3dpZHRoX2lzX2xhcmdlCisjICAgZGVmaW5lIG1hcF9iYW5rd2lkdGhfaXNfbGFyZ2UobWFwKSAobWFwX2Jhbmt3aWR0aChtYXApID4gQklUU19QRVJfTE9ORy84KQorIyAgIHVuZGVmIG1hcF93b3JkcworIyAgIGRlZmluZSBtYXBfd29yZHMobWFwKSBtYXBfY2FsY193b3JkcyhtYXApCisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgbWFwX2Jhbmt3aWR0aChtYXApIDgKKyMgIGRlZmluZSBtYXBfYmFua3dpZHRoX2lzX2xhcmdlKG1hcCkgKEJJVFNfUEVSX0xPTkcgPCA2NCkKKyMgIGRlZmluZSBtYXBfd29yZHMobWFwKSBtYXBfY2FsY193b3JkcyhtYXApCisjIGVuZGlmCisjZGVmaW5lIG1hcF9iYW5rd2lkdGhfaXNfOChtYXApIChtYXBfYmFua3dpZHRoKG1hcCkgPT0gOCkKKyN1bmRlZiBNQVhfTUFQX0JBTktXSURUSAorI2RlZmluZSBNQVhfTUFQX0JBTktXSURUSCA4CisjZWxzZQorI2RlZmluZSBtYXBfYmFua3dpZHRoX2lzXzgobWFwKSAoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNgorIyBpZmRlZiBtYXBfYmFua3dpZHRoCisjICB1bmRlZiBtYXBfYmFua3dpZHRoCisjICBkZWZpbmUgbWFwX2Jhbmt3aWR0aChtYXApICgobWFwKS0+YmFua3dpZHRoKQorIyAgdW5kZWYgbWFwX2Jhbmt3aWR0aF9pc19sYXJnZQorIyAgZGVmaW5lIG1hcF9iYW5rd2lkdGhfaXNfbGFyZ2UobWFwKSAobWFwX2Jhbmt3aWR0aChtYXApID4gQklUU19QRVJfTE9ORy84KQorIyAgdW5kZWYgbWFwX3dvcmRzCisjICBkZWZpbmUgbWFwX3dvcmRzKG1hcCkgbWFwX2NhbGNfd29yZHMobWFwKQorIyBlbHNlCisjICBkZWZpbmUgbWFwX2Jhbmt3aWR0aChtYXApIDE2CisjICBkZWZpbmUgbWFwX2Jhbmt3aWR0aF9pc19sYXJnZShtYXApICgxKQorIyAgZGVmaW5lIG1hcF93b3JkcyhtYXApIG1hcF9jYWxjX3dvcmRzKG1hcCkKKyMgZW5kaWYKKyNkZWZpbmUgbWFwX2Jhbmt3aWR0aF9pc18xNihtYXApIChtYXBfYmFua3dpZHRoKG1hcCkgPT0gMTYpCisjdW5kZWYgTUFYX01BUF9CQU5LV0lEVEgKKyNkZWZpbmUgTUFYX01BUF9CQU5LV0lEVEggMTYKKyNlbHNlCisjZGVmaW5lIG1hcF9iYW5rd2lkdGhfaXNfMTYobWFwKSAoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMgorIyBpZmRlZiBtYXBfYmFua3dpZHRoCisjICB1bmRlZiBtYXBfYmFua3dpZHRoCisjICBkZWZpbmUgbWFwX2Jhbmt3aWR0aChtYXApICgobWFwKS0+YmFua3dpZHRoKQorIyAgdW5kZWYgbWFwX2Jhbmt3aWR0aF9pc19sYXJnZQorIyAgZGVmaW5lIG1hcF9iYW5rd2lkdGhfaXNfbGFyZ2UobWFwKSAobWFwX2Jhbmt3aWR0aChtYXApID4gQklUU19QRVJfTE9ORy84KQorIyAgdW5kZWYgbWFwX3dvcmRzCisjICBkZWZpbmUgbWFwX3dvcmRzKG1hcCkgbWFwX2NhbGNfd29yZHMobWFwKQorIyBlbHNlCisjICBkZWZpbmUgbWFwX2Jhbmt3aWR0aChtYXApIDMyCisjICBkZWZpbmUgbWFwX2Jhbmt3aWR0aF9pc19sYXJnZShtYXApICgxKQorIyAgZGVmaW5lIG1hcF93b3JkcyhtYXApIG1hcF9jYWxjX3dvcmRzKG1hcCkKKyMgZW5kaWYKKyNkZWZpbmUgbWFwX2Jhbmt3aWR0aF9pc18zMihtYXApIChtYXBfYmFua3dpZHRoKG1hcCkgPT0gMzIpCisjdW5kZWYgTUFYX01BUF9CQU5LV0lEVEgKKyNkZWZpbmUgTUFYX01BUF9CQU5LV0lEVEggMzIKKyNlbHNlCisjZGVmaW5lIG1hcF9iYW5rd2lkdGhfaXNfMzIobWFwKSAoMCkKKyNlbmRpZgorCisjaWZuZGVmIG1hcF9iYW5rd2lkdGgKKyNlcnJvciAiTm8gYnVzIHdpZHRoIHN1cHBvcnRlZC4gV2hhdCdzIHRoZSBwb2ludD8iCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgbWFwX2Jhbmt3aWR0aF9zdXBwb3J0ZWQoaW50IHcpCit7CisJc3dpdGNoICh3KSB7CisjaWZkZWYgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xCisJY2FzZSAxOgorI2VuZGlmCisjaWZkZWYgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yCisJY2FzZSAyOgorI2VuZGlmCisjaWZkZWYgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80CisJY2FzZSA0OgorI2VuZGlmCisjaWZkZWYgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84CisJY2FzZSA4OgorI2VuZGlmCisjaWZkZWYgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNgorCWNhc2UgMTY6CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyCisJY2FzZSAzMjoKKyNlbmRpZgorCQlyZXR1cm4gMTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworI2RlZmluZSBNQVhfTUFQX0xPTkdTICggKChNQVhfTUFQX0JBTktXSURUSCo4KSArIEJJVFNfUEVSX0xPTkcgLSAxKSAvIEJJVFNfUEVSX0xPTkcgKQorCit0eXBlZGVmIHVuaW9uIHsKKwl1bnNpZ25lZCBsb25nIHhbTUFYX01BUF9MT05HU107Cit9IG1hcF93b3JkOworCisvKiBUaGUgbWFwIHN0dWZmIGlzIHZlcnkgc2ltcGxlLiBZb3UgZmlsbCBpbiB5b3VyIHN0cnVjdCBtYXBfaW5mbyB3aXRoCisgICBhIGhhbmRmdWwgb2Ygcm91dGluZXMgZm9yIGFjY2Vzc2luZyB0aGUgZGV2aWNlLCBtYWtpbmcgc3VyZSB0aGV5IGhhbmRsZQorICAgcGFnaW5nIGV0Yy4gY29ycmVjdGx5IGlmIHlvdXIgZGV2aWNlIG5lZWRzIGl0LiBUaGVuIHlvdSBwYXNzIGl0IG9mZgorICAgdG8gYSBjaGlwIHByb2JlIHJvdXRpbmUgLS0gZWl0aGVyIEpFREVDIG9yIENGSSBwcm9iZSBvciBib3RoIC0tIHZpYQorICAgZG9fbWFwX3Byb2JlKCkuIElmIGEgY2hpcCBpcyByZWNvZ25pc2VkLCB0aGUgcHJvYmUgY29kZSB3aWxsIGludm9rZSB0aGUKKyAgIGFwcHJvcHJpYXRlIGNoaXAgZHJpdmVyIChpZiBwcmVzZW50KSBhbmQgcmV0dXJuIGEgc3RydWN0IG10ZF9pbmZvLgorICAgQXQgd2hpY2ggcG9pbnQsIHlvdSBmaWxsIGluIHRoZSBtdGQtPm1vZHVsZSB3aXRoIHlvdXIgb3duIG1vZHVsZSAKKyAgIGFkZHJlc3MsIGFuZCByZWdpc3RlciBpdCB3aXRoIHRoZSBNVEQgY29yZSBjb2RlLiBPciB5b3UgY291bGQgcGFydGl0aW9uCisgICBpdCBhbmQgcmVnaXN0ZXIgdGhlIHBhcnRpdGlvbnMgaW5zdGVhZCwgb3Iga2VlcCBpdCBmb3IgeW91ciBvd24gcHJpdmF0ZQorICAgdXNlOyB3aGF0ZXZlci4KKyAgIAorICAgVGhlIG10ZC0+cHJpdiBmaWVsZCB3aWxsIHBvaW50IHRvIHRoZSBzdHJ1Y3QgbWFwX2luZm8sIGFuZCBhbnkgZnVydGhlcgorICAgcHJpdmF0ZSBkYXRhIHJlcXVpcmVkIGJ5IHRoZSBjaGlwIGRyaXZlciBpcyBsaW5rZWQgZnJvbSB0aGUgCisgICBtdGQtPnByaXYtPmZsZHJ2X3ByaXYgZmllbGQuIFRoaXMgYWxsb3dzIHRoZSBtYXAgZHJpdmVyIHRvIGdldCBhdCAKKyAgIHRoZSBkZXN0cnVjdG9yIGZ1bmN0aW9uIG1hcC0+ZmxkcnZfZGVzdHJveSgpIHdoZW4gaXQncyB0aXJlZAorICAgb2YgbGl2aW5nLgorKi8KKworc3RydWN0IG1hcF9pbmZvIHsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHBoeXM7CisjZGVmaW5lIE5PX1hJUCAoLTFVTCkKKworCXZvaWQgX19pb21lbSAqdmlydDsKKwl2b2lkICpjYWNoZWQ7CisKKwlpbnQgYmFua3dpZHRoOyAvKiBpbiBvY3RldHMuIFRoaXMgaXNuJ3QgbmVjZXNzYXJpbHkgdGhlIHdpZHRoCisJCSAgICAgICBvZiBhY3R1YWwgYnVzIGN5Y2xlcyAtLSBpdCdzIHRoZSByZXBlYXQgaW50ZXJ2YWwKKwkJICAgICAgaW4gYnl0ZXMsIGJlZm9yZSB5b3UgYXJlIHRhbGtpbmcgdG8gdGhlIGZpcnN0IGNoaXAgYWdhaW4uCisJCSAgICAgICovCisKKyNpZmRlZiBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MKKwltYXBfd29yZCAoKnJlYWQpKHN0cnVjdCBtYXBfaW5mbyAqLCB1bnNpZ25lZCBsb25nKTsKKwl2b2lkICgqY29weV9mcm9tKShzdHJ1Y3QgbWFwX2luZm8gKiwgdm9pZCAqLCB1bnNpZ25lZCBsb25nLCBzc2l6ZV90KTsKKworCXZvaWQgKCp3cml0ZSkoc3RydWN0IG1hcF9pbmZvICosIGNvbnN0IG1hcF93b3JkLCB1bnNpZ25lZCBsb25nKTsKKwl2b2lkICgqY29weV90bykoc3RydWN0IG1hcF9pbmZvICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IHZvaWQgKiwgc3NpemVfdCk7CisKKwkvKiBXZSBjYW4gcGVyaGFwcyBwdXQgaW4gJ3BvaW50JyBhbmQgJ3VucG9pbnQnIG1ldGhvZHMsIGlmIHdlIHJlYWxseQorCSAgIHdhbnQgdG8gZW5hYmxlIFhJUCBmb3Igbm9uLWxpbmVhciBtYXBwaW5ncy4gTm90IHlldCB0aG91Z2guICovCisjZW5kaWYKKwkvKiBJdCdzIHBvc3NpYmxlIGZvciB0aGUgbWFwIGRyaXZlciB0byB1c2UgY2FjaGVkIG1lbW9yeSBpbiBpdHMKKwkgICBjb3B5X2Zyb20gaW1wbGVtZW50YXRpb24gKGFuZCBfb25seV8gd2l0aCBjb3B5X2Zyb20pLiAgSG93ZXZlciwKKwkgICB3aGVuIHRoZSBjaGlwIGRyaXZlciBrbm93cyBzb21lIGZsYXNoIGFyZWEgaGFzIGNoYW5nZWQgY29udGVudHMsCisJICAgaXQgd2lsbCBzaWduYWwgaXQgdG8gdGhlIG1hcCBkcml2ZXIgdGhyb3VnaCB0aGlzIHJvdXRpbmUgdG8gbGV0CisJICAgdGhlIG1hcCBkcml2ZXIgaW52YWxpZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSBhcyBuZWVkZWQuCisJICAgSWYgdGhlcmUgaXMgbm8gY2FjaGUgdG8gY2FyZSBhYm91dCB0aGlzIGNhbiBiZSBzZXQgdG8gTlVMTC4gKi8KKwl2b2lkICgqaW52YWxfY2FjaGUpKHN0cnVjdCBtYXBfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBzc2l6ZV90KTsKKworCS8qIHNldF92cHAoKSBtdXN0IGhhbmRsZSBiZWluZyByZWVudGVyZWQgLS0gZW5hYmxlLCBlbmFibGUsIGRpc2FibGUgCisJICAgbXVzdCBsZWF2ZSBpdCBlbmFibGVkLiAqLworCXZvaWQgKCpzZXRfdnBwKShzdHJ1Y3QgbWFwX2luZm8gKiwgaW50KTsKKworCXVuc2lnbmVkIGxvbmcgbWFwX3ByaXZfMTsKKwl1bnNpZ25lZCBsb25nIG1hcF9wcml2XzI7CisJdm9pZCAqZmxkcnZfcHJpdjsKKwlzdHJ1Y3QgbXRkX2NoaXBfZHJpdmVyICpmbGRydjsKK307CisKK3N0cnVjdCBtdGRfY2hpcF9kcml2ZXIgeworCXN0cnVjdCBtdGRfaW5mbyAqKCpwcm9iZSkoc3RydWN0IG1hcF9pbmZvICptYXApOworCXZvaWQgKCpkZXN0cm95KShzdHJ1Y3QgbXRkX2luZm8gKik7CisJc3RydWN0IG1vZHVsZSAqbW9kdWxlOworCWNoYXIgKm5hbWU7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKwordm9pZCByZWdpc3Rlcl9tdGRfY2hpcF9kcml2ZXIoc3RydWN0IG10ZF9jaGlwX2RyaXZlciAqKTsKK3ZvaWQgdW5yZWdpc3Rlcl9tdGRfY2hpcF9kcml2ZXIoc3RydWN0IG10ZF9jaGlwX2RyaXZlciAqKTsKKworc3RydWN0IG10ZF9pbmZvICpkb19tYXBfcHJvYmUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1hcF9pbmZvICptYXApOwordm9pZCBtYXBfZGVzdHJveShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CisKKyNkZWZpbmUgRU5BQkxFX1ZQUChtYXApIGRvIHsgaWYobWFwLT5zZXRfdnBwKSBtYXAtPnNldF92cHAobWFwLCAxKTsgfSB3aGlsZSgwKQorI2RlZmluZSBESVNBQkxFX1ZQUChtYXApIGRvIHsgaWYobWFwLT5zZXRfdnBwKSBtYXAtPnNldF92cHAobWFwLCAwKTsgfSB3aGlsZSgwKQorCisjZGVmaW5lIElOVkFMSURBVEVfQ0FDSEVEX1JBTkdFKG1hcCwgZnJvbSwgc2l6ZSkgXAorCWRvIHsgaWYobWFwLT5pbnZhbF9jYWNoZSkgbWFwLT5pbnZhbF9jYWNoZShtYXAsIGZyb20sIHNpemUpOyB9IHdoaWxlKDApCisKKworc3RhdGljIGlubGluZSBpbnQgbWFwX3dvcmRfZXF1YWwoc3RydWN0IG1hcF9pbmZvICptYXAsIG1hcF93b3JkIHZhbDEsIG1hcF93b3JkIHZhbDIpCit7CisJaW50IGk7CisJZm9yIChpPTA7IGk8bWFwX3dvcmRzKG1hcCk7IGkrKykgeworCQlpZiAodmFsMS54W2ldICE9IHZhbDIueFtpXSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBtYXBfd29yZCBtYXBfd29yZF9hbmQoc3RydWN0IG1hcF9pbmZvICptYXAsIG1hcF93b3JkIHZhbDEsIG1hcF93b3JkIHZhbDIpCit7CisJbWFwX3dvcmQgcjsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPG1hcF93b3JkcyhtYXApOyBpKyspIHsKKwkJci54W2ldID0gdmFsMS54W2ldICYgdmFsMi54W2ldOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGlubGluZSBtYXBfd29yZCBtYXBfd29yZF9vcihzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgbWFwX3dvcmQgdmFsMSwgbWFwX3dvcmQgdmFsMikKK3sKKwltYXBfd29yZCByOworCWludCBpOworCisJZm9yIChpPTA7IGk8bWFwX3dvcmRzKG1hcCk7IGkrKykgeworCQlyLnhbaV0gPSB2YWwxLnhbaV0gfCB2YWwyLnhbaV07CisJfQorCXJldHVybiByOworfQorI2RlZmluZSBtYXBfd29yZF9hbmRlcXVhbChtLCBhLCBiLCB6KSBtYXBfd29yZF9lcXVhbChtLCB6LCBtYXBfd29yZF9hbmQobSwgYSwgYikpCisKK3N0YXRpYyBpbmxpbmUgaW50IG1hcF93b3JkX2JpdHNzZXQoc3RydWN0IG1hcF9pbmZvICptYXAsIG1hcF93b3JkIHZhbDEsIG1hcF93b3JkIHZhbDIpCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTxtYXBfd29yZHMobWFwKTsgaSsrKSB7CisJCWlmICh2YWwxLnhbaV0gJiB2YWwyLnhbaV0pCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgbWFwX3dvcmQgbWFwX3dvcmRfbG9hZChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgY29uc3Qgdm9pZCAqcHRyKQoreworCW1hcF93b3JkIHI7CisKKwlpZiAobWFwX2Jhbmt3aWR0aF9pc18xKG1hcCkpCisJCXIueFswXSA9ICoodW5zaWduZWQgY2hhciAqKXB0cjsKKwllbHNlIGlmIChtYXBfYmFua3dpZHRoX2lzXzIobWFwKSkKKwkJci54WzBdID0gZ2V0X3VuYWxpZ25lZCgodWludDE2X3QgKilwdHIpOworCWVsc2UgaWYgKG1hcF9iYW5rd2lkdGhfaXNfNChtYXApKQorCQlyLnhbMF0gPSBnZXRfdW5hbGlnbmVkKCh1aW50MzJfdCAqKXB0cik7CisjaWYgQklUU19QRVJfTE9ORyA+PSA2NAorCWVsc2UgaWYgKG1hcF9iYW5rd2lkdGhfaXNfOChtYXApKQorCQlyLnhbMF0gPSBnZXRfdW5hbGlnbmVkKCh1aW50NjRfdCAqKXB0cik7CisjZW5kaWYKKwllbHNlIGlmIChtYXBfYmFua3dpZHRoX2lzX2xhcmdlKG1hcCkpCisJCW1lbWNweShyLngsIHB0ciwgbWFwLT5iYW5rd2lkdGgpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgbWFwX3dvcmQgbWFwX3dvcmRfbG9hZF9wYXJ0aWFsKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBtYXBfd29yZCBvcmlnLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydCwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWlmIChtYXBfYmFua3dpZHRoX2lzX2xhcmdlKG1hcCkpIHsKKwkJY2hhciAqZGVzdCA9IChjaGFyICopJm9yaWc7CisJCW1lbWNweShkZXN0K3N0YXJ0LCBidWYsIGxlbik7CisJfSBlbHNlIHsKKwkJZm9yIChpPXN0YXJ0OyBpIDwgc3RhcnQrbGVuOyBpKyspIHsKKwkJCWludCBiaXRwb3M7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJCQliaXRwb3MgPSBpKjg7CisjZWxzZSAvKiBfX0JJR19FTkRJQU4gKi8KKwkJCWJpdHBvcyA9IChtYXBfYmFua3dpZHRoKG1hcCktMS1pKSo4OworI2VuZGlmCisJCQlvcmlnLnhbMF0gJj0gfigweGZmIDw8IGJpdHBvcyk7CisJCQlvcmlnLnhbMF0gfD0gYnVmW2ktc3RhcnRdIDw8IGJpdHBvczsKKwkJfQorCX0KKwlyZXR1cm4gb3JpZzsKK30KKworc3RhdGljIGlubGluZSBtYXBfd29yZCBtYXBfd29yZF9mZihzdHJ1Y3QgbWFwX2luZm8gKm1hcCkKK3sKKwltYXBfd29yZCByOworCWludCBpOworCisJZm9yIChpPTA7IGk8bWFwX3dvcmRzKG1hcCk7IGkrKykgeworCQlyLnhbaV0gPSB+MFVMOworCX0KKwlyZXR1cm4gcjsKK30KK3N0YXRpYyBpbmxpbmUgbWFwX3dvcmQgaW5saW5lX21hcF9yZWFkKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIG9mcykKK3sKKwltYXBfd29yZCByOworCisJaWYgKG1hcF9iYW5rd2lkdGhfaXNfMShtYXApKQorCQlyLnhbMF0gPSBfX3Jhd19yZWFkYihtYXAtPnZpcnQgKyBvZnMpOworCWVsc2UgaWYgKG1hcF9iYW5rd2lkdGhfaXNfMihtYXApKQorCQlyLnhbMF0gPSBfX3Jhd19yZWFkdyhtYXAtPnZpcnQgKyBvZnMpOworCWVsc2UgaWYgKG1hcF9iYW5rd2lkdGhfaXNfNChtYXApKQorCQlyLnhbMF0gPSBfX3Jhd19yZWFkbChtYXAtPnZpcnQgKyBvZnMpOworI2lmIEJJVFNfUEVSX0xPTkcgPj0gNjQKKwllbHNlIGlmIChtYXBfYmFua3dpZHRoX2lzXzgobWFwKSkKKwkJci54WzBdID0gX19yYXdfcmVhZHEobWFwLT52aXJ0ICsgb2ZzKTsKKyNlbmRpZgorCWVsc2UgaWYgKG1hcF9iYW5rd2lkdGhfaXNfbGFyZ2UobWFwKSkKKwkJbWVtY3B5X2Zyb21pbyhyLngsIG1hcC0+dmlydCtvZnMsIG1hcC0+YmFua3dpZHRoKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5saW5lX21hcF93cml0ZShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgY29uc3QgbWFwX3dvcmQgZGF0dW0sIHVuc2lnbmVkIGxvbmcgb2ZzKQoreworCWlmIChtYXBfYmFua3dpZHRoX2lzXzEobWFwKSkKKwkJX19yYXdfd3JpdGViKGRhdHVtLnhbMF0sIG1hcC0+dmlydCArIG9mcyk7CisJZWxzZSBpZiAobWFwX2Jhbmt3aWR0aF9pc18yKG1hcCkpCisJCV9fcmF3X3dyaXRldyhkYXR1bS54WzBdLCBtYXAtPnZpcnQgKyBvZnMpOworCWVsc2UgaWYgKG1hcF9iYW5rd2lkdGhfaXNfNChtYXApKQorCQlfX3Jhd193cml0ZWwoZGF0dW0ueFswXSwgbWFwLT52aXJ0ICsgb2ZzKTsKKyNpZiBCSVRTX1BFUl9MT05HID49IDY0CisJZWxzZSBpZiAobWFwX2Jhbmt3aWR0aF9pc184KG1hcCkpCisJCV9fcmF3X3dyaXRlcShkYXR1bS54WzBdLCBtYXAtPnZpcnQgKyBvZnMpOworI2VuZGlmCisJZWxzZSBpZiAobWFwX2Jhbmt3aWR0aF9pc19sYXJnZShtYXApKQorCQltZW1jcHlfdG9pbyhtYXAtPnZpcnQrb2ZzLCBkYXR1bS54LCBtYXAtPmJhbmt3aWR0aCk7CisJbWIoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlubGluZV9tYXBfY29weV9mcm9tKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB2b2lkICp0bywgdW5zaWduZWQgbG9uZyBmcm9tLCBzc2l6ZV90IGxlbikKK3sKKwlpZiAobWFwLT5jYWNoZWQpCisJCW1lbWNweSh0bywgKGNoYXIgKiltYXAtPmNhY2hlZCArIGZyb20sIGxlbik7CisJZWxzZQorCQltZW1jcHlfZnJvbWlvKHRvLCBtYXAtPnZpcnQgKyBmcm9tLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5saW5lX21hcF9jb3B5X3RvKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIHRvLCBjb25zdCB2b2lkICpmcm9tLCBzc2l6ZV90IGxlbikKK3sKKwltZW1jcHlfdG9pbyhtYXAtPnZpcnQgKyB0bywgZnJvbSwgbGVuKTsKK30KKworI2lmZGVmIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUworI2RlZmluZSBtYXBfcmVhZChtYXAsIG9mcykgKG1hcCktPnJlYWQobWFwLCBvZnMpCisjZGVmaW5lIG1hcF9jb3B5X2Zyb20obWFwLCB0bywgZnJvbSwgbGVuKSAobWFwKS0+Y29weV9mcm9tKG1hcCwgdG8sIGZyb20sIGxlbikKKyNkZWZpbmUgbWFwX3dyaXRlKG1hcCwgZGF0dW0sIG9mcykgKG1hcCktPndyaXRlKG1hcCwgZGF0dW0sIG9mcykKKyNkZWZpbmUgbWFwX2NvcHlfdG8obWFwLCB0bywgZnJvbSwgbGVuKSAobWFwKS0+Y29weV90byhtYXAsIHRvLCBmcm9tLCBsZW4pCisKK2V4dGVybiB2b2lkIHNpbXBsZV9tYXBfaW5pdChzdHJ1Y3QgbWFwX2luZm8gKik7CisjZGVmaW5lIG1hcF9pc19saW5lYXIobWFwKSAobWFwLT5waHlzICE9IE5PX1hJUCkKKworI2Vsc2UKKyNkZWZpbmUgbWFwX3JlYWQobWFwLCBvZnMpIGlubGluZV9tYXBfcmVhZChtYXAsIG9mcykKKyNkZWZpbmUgbWFwX2NvcHlfZnJvbShtYXAsIHRvLCBmcm9tLCBsZW4pIGlubGluZV9tYXBfY29weV9mcm9tKG1hcCwgdG8sIGZyb20sIGxlbikKKyNkZWZpbmUgbWFwX3dyaXRlKG1hcCwgZGF0dW0sIG9mcykgaW5saW5lX21hcF93cml0ZShtYXAsIGRhdHVtLCBvZnMpCisjZGVmaW5lIG1hcF9jb3B5X3RvKG1hcCwgdG8sIGZyb20sIGxlbikgaW5saW5lX21hcF9jb3B5X3RvKG1hcCwgdG8sIGZyb20sIGxlbikKKworCisjZGVmaW5lIHNpbXBsZV9tYXBfaW5pdChtYXApIEJVR19PTighbWFwX2Jhbmt3aWR0aF9zdXBwb3J0ZWQoKG1hcCktPmJhbmt3aWR0aCkpCisjZGVmaW5lIG1hcF9pc19saW5lYXIobWFwKSAoMSkKKworI2VuZGlmIC8qICFDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgKi8KKworI2VuZGlmIC8qIF9fTElOVVhfTVREX01BUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL210ZC5oIGIvaW5jbHVkZS9saW51eC9tdGQvbXRkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkMTM0MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCkBAIC0wLDAgKzEsMjI2IEBACisvKiAKKyAqICRJZDogbXRkLmgsdiAxLjU2IDIwMDQvMDgvMDkgMTg6NDY6MDQgZG1hcmxpbiBFeHAgJAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAzIERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4gZXQgYWwuCisgKgorICogUmVsZWFzZWQgdW5kZXIgR1BMCisgKi8KKworI2lmbmRlZiBfX01URF9NVERfSF9fCisjZGVmaW5lIF9fTVREX01URF9IX18KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjZXJyb3IgVGhpcyBpcyBhIGtlcm5lbCBoZWFkZXIuIFBlcmhhcHMgaW5jbHVkZSBtdGQtdXNlci5oIGluc3RlYWQ/CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorCisjaW5jbHVkZSA8bGludXgvbXRkL2NvbXBhdG1hYy5oPgorI2luY2x1ZGUgPG10ZC9tdGQtYWJpLmg+CisKKyNkZWZpbmUgTVREX0NIQVJfTUFKT1IgOTAKKyNkZWZpbmUgTVREX0JMT0NLX01BSk9SIDMxCisjZGVmaW5lIE1BWF9NVERfREVWSUNFUyAxNgorCisjZGVmaW5lIE1URF9FUkFTRV9QRU5ESU5HICAgICAgCTB4MDEKKyNkZWZpbmUgTVREX0VSQVNJTkcJCTB4MDIKKyNkZWZpbmUgTVREX0VSQVNFX1NVU1BFTkQJMHgwNAorI2RlZmluZSBNVERfRVJBU0VfRE9ORSAgICAgICAgICAweDA4CisjZGVmaW5lIE1URF9FUkFTRV9GQUlMRUQgICAgICAgIDB4MTAKKworLyogSWYgdGhlIGVyYXNlIGZhaWxzLCBmYWlsX2FkZHIgbWlnaHQgaW5kaWNhdGUgZXhhY3RseSB3aGljaCBibG9jayBmYWlsZWQuICBJZgorICAgZmFpbF9hZGRyID0gMHhmZmZmZmZmZiwgdGhlIGZhaWx1cmUgd2FzIG5vdCBhdCB0aGUgZGV2aWNlIGxldmVsIG9yIHdhcyBub3QKKyAgIHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyIGJsb2NrLiAqLworc3RydWN0IGVyYXNlX2luZm8geworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCXVfaW50MzJfdCBhZGRyOworCXVfaW50MzJfdCBsZW47CisJdV9pbnQzMl90IGZhaWxfYWRkcjsKKwl1X2xvbmcgdGltZTsKKwl1X2xvbmcgcmV0cmllczsKKwl1X2ludCBkZXY7CisJdV9pbnQgY2VsbDsKKwl2b2lkICgqY2FsbGJhY2spIChzdHJ1Y3QgZXJhc2VfaW5mbyAqc2VsZik7CisJdV9sb25nIHByaXY7CisJdV9jaGFyIHN0YXRlOworCXN0cnVjdCBlcmFzZV9pbmZvICpuZXh0OworfTsKKworc3RydWN0IG10ZF9lcmFzZV9yZWdpb25faW5mbyB7CisJdV9pbnQzMl90IG9mZnNldDsJCQkvKiBBdCB3aGljaCB0aGlzIHJlZ2lvbiBzdGFydHMsIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgTVREICovCisJdV9pbnQzMl90IGVyYXNlc2l6ZTsJCS8qIEZvciB0aGlzIHJlZ2lvbiAqLworCXVfaW50MzJfdCBudW1ibG9ja3M7CQkvKiBOdW1iZXIgb2YgYmxvY2tzIG9mIGVyYXNlc2l6ZSBpbiB0aGlzIHJlZ2lvbiAqLworfTsKKworc3RydWN0IG10ZF9pbmZvIHsKKwl1X2NoYXIgdHlwZTsKKwl1X2ludDMyX3QgZmxhZ3M7CisJdV9pbnQzMl90IHNpemU7CSAvLyBUb3RhbCBzaXplIG9mIHRoZSBNVEQKKworCS8qICJNYWpvciIgZXJhc2Ugc2l6ZSBmb3IgdGhlIGRldmljZS4gTmHvdmUgdXNlcnMgbWF5IHRha2UgdGhpcworCSAqIHRvIGJlIHRoZSBvbmx5IGVyYXNlIHNpemUgYXZhaWxhYmxlLCBvciBtYXkgdXNlIHRoZSBtb3JlIGRldGFpbGVkCisJICogaW5mb3JtYXRpb24gYmVsb3cgaWYgdGhleSBkZXNpcmUKKwkgKi8KKwl1X2ludDMyX3QgZXJhc2VzaXplOworCisJdV9pbnQzMl90IG9vYmJsb2NrOyAgLy8gU2l6ZSBvZiBPT0IgYmxvY2tzIChlLmcuIDUxMikKKwl1X2ludDMyX3Qgb29ic2l6ZTsgICAvLyBBbW91bnQgb2YgT09CIGRhdGEgcGVyIGJsb2NrIChlLmcuIDE2KQorCXVfaW50MzJfdCBvb2JhdmFpbDsgIC8vIE51bWJlciBvZiBieXRlcyBpbiBPT0IgYXJlYSBhdmFpbGFibGUgZm9yIGZzIAorCXVfaW50MzJfdCBlY2N0eXBlOworCXVfaW50MzJfdCBlY2NzaXplOworCQorCisJLy8gS2VybmVsLW9ubHkgc3R1ZmYgc3RhcnRzIGhlcmUuCisJY2hhciAqbmFtZTsKKwlpbnQgaW5kZXg7CisKKwkvLyBvb2JpbmZvIGlzIGEgbmFuZF9vb2JpbmZvIHN0cnVjdHVyZSwgd2hpY2ggY2FuIGJlIHNldCBieSBpb3RjbCAoTUVNU0VUT09CSU5GTykKKwlzdHJ1Y3QgbmFuZF9vb2JpbmZvIG9vYmluZm87CisKKwkvKiBEYXRhIGZvciB2YXJpYWJsZSBlcmFzZSByZWdpb25zLiBJZiBudW1lcmFzZXJlZ2lvbnMgaXMgemVybywKKwkgKiBpdCBtZWFucyB0aGF0IHRoZSB3aG9sZSBkZXZpY2UgaGFzIGVyYXNlc2l6ZSBhcyBnaXZlbiBhYm92ZS4gCisJICovCisJaW50IG51bWVyYXNlcmVnaW9uczsKKwlzdHJ1Y3QgbXRkX2VyYXNlX3JlZ2lvbl9pbmZvICplcmFzZXJlZ2lvbnM7IAorCisJLyogVGhpcyByZWFsbHkgc2hvdWxkbid0IGJlIGhlcmUuIEl0IGNhbiBnbyBhd2F5IGluIDIuNSAqLworCXVfaW50MzJfdCBiYW5rX3NpemU7CisKKwlpbnQgKCplcmFzZSkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpOworCisJLyogVGhpcyBzdHVmZiBmb3IgZVhlY3V0ZS1Jbi1QbGFjZSAqLworCWludCAoKnBvaW50KSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICoqbXRkYnVmKTsKKworCS8qIFdlIHByb2JhYmx5IHNob3VsZG4ndCBhbGxvdyBYSVAgaWYgdGhlIHVucG9pbnQgaXNuJ3QgYSBOVUxMICovCisJdm9pZCAoKnVucG9pbnQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICogYWRkciwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4pOworCisKKwlpbnQgKCpyZWFkKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOworCWludCAoKndyaXRlKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKTsKKworCWludCAoKnJlYWRfZWNjKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYsIHVfY2hhciAqZWNjYnVmLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwpOworCWludCAoKndyaXRlX2VjYykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1ZiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCk7CisKKwlpbnQgKCpyZWFkX29vYikgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKKwlpbnQgKCp3cml0ZV9vb2IpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpOworCisJLyogCisJICogTWV0aG9kcyB0byBhY2Nlc3MgdGhlIHByb3RlY3Rpb24gcmVnaXN0ZXIgYXJlYSwgcHJlc2VudCBpbiBzb21lIAorCSAqIGZsYXNoIGRldmljZXMuIFRoZSB1c2VyIGRhdGEgaXMgb25lIHRpbWUgcHJvZ3JhbW1hYmxlIGJ1dCB0aGUKKwkgKiBmYWN0b3J5IGRhdGEgaXMgcmVhZCBvbmx5LiAKKwkgKi8KKwlpbnQgKCpyZWFkX3VzZXJfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CisKKwlpbnQgKCpyZWFkX2ZhY3RfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CisKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwlpbnQgKCp3cml0ZV91c2VyX3Byb3RfcmVnKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOworCisJLyoga3ZlYy1iYXNlZCByZWFkL3dyaXRlIG1ldGhvZHMuIFdlIG5lZWQgdGhlc2UgZXNwZWNpYWxseSBmb3IgTkFORCBmbGFzaCwKKwkgICB3aXRoIGl0cyBsaW1pdGVkIG51bWJlciBvZiB3cml0ZSBjeWNsZXMgcGVyIGVyYXNlLgorCSAgIE5COiBUaGUgJ2NvdW50JyBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiBfdmVjdG9yc18sIGVhY2ggb2YgCisJICAgd2hpY2ggY29udGFpbnMgYW4gKG9mcywgbGVuKSB0dXBsZS4KKwkqLworCWludCAoKnJlYWR2KSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgZnJvbSwgc2l6ZV90ICpyZXRsZW4pOworCWludCAoKnJlYWR2X2VjYykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3Qga3ZlYyAqdmVjcywgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IGZyb20sIAorCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCk7CisJaW50ICgqd3JpdGV2KSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIHNpemVfdCAqcmV0bGVuKTsKKwlpbnQgKCp3cml0ZXZfZWNjKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIAorCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCk7CisKKwkvKiBTeW5jICovCisJdm9pZCAoKnN5bmMpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CisKKwkvKiBDaGlwLXN1cHBvcnRlZCBkZXZpY2UgbG9ja2luZyAqLworCWludCAoKmxvY2spIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbik7CisJaW50ICgqdW5sb2NrKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pOworCisJLyogUG93ZXIgTWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KKwlpbnQgKCpzdXNwZW5kKSAoc3RydWN0IG10ZF9pbmZvICptdGQpOworCXZvaWQgKCpyZXN1bWUpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CisKKwkvKiBCYWQgYmxvY2sgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KKwlpbnQgKCpibG9ja19pc2JhZCkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzKTsKKwlpbnQgKCpibG9ja19tYXJrYmFkKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMpOworCisJdm9pZCAqcHJpdjsKKworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCWludCB1c2Vjb3VudDsKK307CisKKworCS8qIEtlcm5lbC1zaWRlIGlvY3RsIGRlZmluaXRpb25zICovCisKK2V4dGVybiBpbnQgYWRkX210ZF9kZXZpY2Uoc3RydWN0IG10ZF9pbmZvICptdGQpOworZXh0ZXJuIGludCBkZWxfbXRkX2RldmljZSAoc3RydWN0IG10ZF9pbmZvICptdGQpOworCitleHRlcm4gc3RydWN0IG10ZF9pbmZvICpnZXRfbXRkX2RldmljZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG51bSk7CisKK2V4dGVybiB2b2lkIHB1dF9tdGRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKKworCitzdHJ1Y3QgbXRkX25vdGlmaWVyIHsKKwl2b2lkICgqYWRkKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CisJdm9pZCAoKnJlbW92ZSkoc3RydWN0IG10ZF9pbmZvICptdGQpOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKworZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfbXRkX3VzZXIgKHN0cnVjdCBtdGRfbm90aWZpZXIgKm5ldyk7CitleHRlcm4gaW50IHVucmVnaXN0ZXJfbXRkX3VzZXIgKHN0cnVjdCBtdGRfbm90aWZpZXIgKm9sZCk7CisKK2ludCBkZWZhdWx0X210ZF93cml0ZXYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLCBzaXplX3QgKnJldGxlbik7CisKK2ludCBkZWZhdWx0X210ZF9yZWFkdihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGt2ZWMgKnZlY3MsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCBmcm9tLCBzaXplX3QgKnJldGxlbik7CisKKyNkZWZpbmUgTVREX0VSQVNFKG10ZCwgYXJncy4uLikgKCoobXRkLT5lcmFzZSkpKG10ZCwgYXJncykKKyNkZWZpbmUgTVREX1BPSU5UKG10ZCwgYSxiLGMsZCkgKCoobXRkLT5wb2ludCkpKG10ZCwgYSxiLGMsICh1X2NoYXIgKiopKGQpKQorI2RlZmluZSBNVERfVU5QT0lOVChtdGQsIGFyZykgKCoobXRkLT51bnBvaW50KSkobXRkLCAodV9jaGFyICopYXJnKQorI2RlZmluZSBNVERfUkVBRChtdGQsIGFyZ3MuLi4pICgqKG10ZC0+cmVhZCkpKG10ZCwgYXJncykKKyNkZWZpbmUgTVREX1dSSVRFKG10ZCwgYXJncy4uLikgKCoobXRkLT53cml0ZSkpKG10ZCwgYXJncykKKyNkZWZpbmUgTVREX1JFQURWKG10ZCwgYXJncy4uLikgKCoobXRkLT5yZWFkdikpKG10ZCwgYXJncykKKyNkZWZpbmUgTVREX1dSSVRFVihtdGQsIGFyZ3MuLi4pICgqKG10ZC0+d3JpdGV2KSkobXRkLCBhcmdzKQorI2RlZmluZSBNVERfUkVBREVDQyhtdGQsIGFyZ3MuLi4pICgqKG10ZC0+cmVhZF9lY2MpKShtdGQsIGFyZ3MpCisjZGVmaW5lIE1URF9XUklURUVDQyhtdGQsIGFyZ3MuLi4pICgqKG10ZC0+d3JpdGVfZWNjKSkobXRkLCBhcmdzKQorI2RlZmluZSBNVERfUkVBRE9PQihtdGQsIGFyZ3MuLi4pICgqKG10ZC0+cmVhZF9vb2IpKShtdGQsIGFyZ3MpCisjZGVmaW5lIE1URF9XUklURU9PQihtdGQsIGFyZ3MuLi4pICgqKG10ZC0+d3JpdGVfb29iKSkobXRkLCBhcmdzKQorI2RlZmluZSBNVERfU1lOQyhtdGQpIGRvIHsgaWYgKG10ZC0+c3luYykgKCoobXRkLT5zeW5jKSkobXRkKTsgIH0gd2hpbGUgKDApIAorCisKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKK3ZvaWQgbXRkX2VyYXNlX2NhbGxiYWNrKHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG10ZF9lcmFzZV9jYWxsYmFjayhzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpCit7CisJaWYgKGluc3RyLT5jYWxsYmFjaykKKwkJaW5zdHItPmNhbGxiYWNrKGluc3RyKTsKK30KKyNlbmRpZgorCisvKgorICogRGVidWdnaW5nIG1hY3JvIGFuZCBkZWZpbmVzCisgKi8KKyNkZWZpbmUgTVREX0RFQlVHX0xFVkVMMAkoMCkJLyogUXVpZXQgICAqLworI2RlZmluZSBNVERfREVCVUdfTEVWRUwxCSgxKQkvKiBBdWRpYmxlICovCisjZGVmaW5lIE1URF9ERUJVR19MRVZFTDIJKDIpCS8qIExvdWQgICAgKi8KKyNkZWZpbmUgTVREX0RFQlVHX0xFVkVMMwkoMykJLyogTm9pc3kgICAqLworCisjaWZkZWYgQ09ORklHX01URF9ERUJVRworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQkJCQlcCisgCWRvIHsJCQkJCQlcCisJCWlmIChuIDw9IENPTkZJR19NVERfREVCVUdfVkVSQk9TRSkJXAorCQkJcHJpbnRrKEtFUk5fSU5GTyBhcmdzKTsJCVwKKwl9IHdoaWxlKDApCisjZWxzZSAvKiBDT05GSUdfTVREX0RFQlVHICovCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSgwKQorCisjZW5kaWYgLyogQ09ORklHX01URF9ERUJVRyAqLworCisjZW5kaWYgLyogX19NVERfTVREX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oIGIvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTljNjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgKQEAgLTAsMCArMSw0NjkgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMCBEYXZpZCBXb29kaG91c2UgPGR3bXcyQG12aGkuY29tPgorICogICAgICAgICAgICAgICAgICAgICBTdGV2ZW4gSi4gSGlsbCA8c2poaWxsQHJlYWxpdHlkaWx1dGVkLmNvbT4KKyAqCQkgICAgICAgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKgorICogJElkOiBuYW5kLmgsdiAxLjY4IDIwMDQvMTEvMTIgMTA6NDA6MzcgZ2xlaXhuZXIgRXhwICQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBJbmZvOgorICogICBDb250YWlucyBzdGFuZGFyZCBkZWZpbmVzIGFuZCBJRHMgZm9yIE5BTkQgZmxhc2ggZGV2aWNlcworICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgIDAxLTMxLTIwMDAgRE1XICAgICBDcmVhdGVkCisgKiAgIDA5LTE4LTIwMDAgU0pIICAgICBNb3ZlZCBzdHJ1Y3R1cmUgb3V0IG9mIHRoZSBEaXNrLU9uLUNoaXAgZHJpdmVycworICoJCQlzbyBpdCBjYW4gYmUgdXNlZCBieSBvdGhlciBOQU5EIGZsYXNoIGRldmljZQorICoJCQlkcml2ZXJzLiBJIGFsc28gY2hhbmdlZCB0aGUgY29weXJpZ2h0IHNpbmNlIG5vbmUKKyAqCQkJb2YgdGhlIG9yaWdpbmFsIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3BlY2lmaWMKKyAqCQkJdG8gRG9DIGRldmljZXMuIERhdmlkIGNhbiB3aGFjayBtZSB3aXRoIGEgYmFzZWJhbGwKKyAqCQkJYmF0IGxhdGVyIGlmIEkgZGlkIHNvbWV0aGluZyBuYXVnaHR5LgorICogICAxMC0xMS0yMDAwIFNKSCAgICAgQWRkZWQgcHJpdmF0ZSBOQU5EIGZsYXNoIHN0cnVjdHVyZSBmb3IgZHJpdmVyCisgKiAgIDEwLTI0LTIwMDAgU0pIICAgICBBZGRlZCBwcm90b3R5cGUgZm9yICduYW5kX3NjYW4nIGZ1bmN0aW9uCisgKiAgIDEwLTI5LTIwMDEgVEcJY2hhbmdlZCBuYW5kX2NoaXAgc3RydWN0dXJlIHRvIHN1cHBvcnQgCisgKgkJCWhhcmR3YXJlc3BlY2lmaWMgZnVuY3Rpb24gZm9yIGFjY2Vzc2luZyBjb250cm9sIGxpbmVzCisgKiAgIDAyLTIxLTIwMDIgVEcJYWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IHJlYWQvd3JpdGUgYWRyZXNzIGFuZAorICoJCQlyZWFkeS9idXN5IGxpbmUgYWNjZXNzIGZ1bmN0aW9uCisgKiAgIDAyLTI2LTIwMDIgVEcJYWRkZWQgY2hpcF9kZWxheSB0byBuYW5kX2NoaXAgc3RydWN0dXJlIHRvIG9wdGltaXplCisgKgkJCWNvbW1hbmQgZGVsYXkgdGltZXMgZm9yIGRpZmZlcmVudCBjaGlwcworICogICAwNC0yOC0yMDAyIFRHCU9PQiBjb25maWcgZGVmaW5lcyBtb3ZlZCBmcm9tIG5hbmQuYyB0byBhdm9pZCBkdXBsaWNhdGUKKyAqCQkJZGVmaW5lcyBpbiBqZmZzMi93YnVmLmMKKyAqICAgMDgtMDctMjAwMiBURwlmb3JjZWQgYmFkIGJsb2NrIGxvY2F0aW9uIHRvIGJ5dGUgNSBvZiBPT0IsIGV2ZW4gaWYKKyAqCQkJQ09ORklHX01URF9OQU5EX0VDQ19KRkZTMiBpcyBub3Qgc2V0CisgKiAgIDA4LTEwLTIwMDIgVEcJZXh0ZW5zaW9ucyB0byBuYW5kX2NoaXAgc3RydWN0dXJlIHRvIHN1cHBvcnQgSFctRUNDCisgKgorICogICAwOC0yOS0yMDAyIHRnbHggCW5hbmRfY2hpcCBzdHJ1Y3R1cmU6IGRhdGFfcG9pIGZvciBzZWxlY3RpbmcgCisgKgkJCWludGVybmFsIC8gZnMtZHJpdmVyIGJ1ZmZlcgorICoJCQlzdXBwb3J0IGZvciA2Ynl0ZS81MTJieXRlIGhhcmR3YXJlIEVDQworICoJCQlyZWFkX2VjYywgd3JpdGVfZWNjIGV4dGVuZGVkIGZvciBkaWZmZXJlbnQgb29iLWxheW91dAorICoJCQlvb2IgbGF5b3V0IHNlbGVjdGlvbnM6IE5BTkRfTk9ORV9PT0IsIE5BTkRfSkZGUzJfT09CLAorICoJCQlOQU5EX1lBRkZTX09PQgorICogIDExLTI1LTIwMDIgdGdseAlBZGRlZCBNYW51ZmFjdHVyZXIgY29kZSBGVUpJVFNVLCBOQVRJT05BTAorICoJCQlTcGxpdCBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBJRCBzdHJ1Y3R1cmVzIAorICoKKyAqICAwMi0wOC0yMDA0IHRnbHggCWFkZGVkIG9wdGlvbiBmaWVsZCB0byBuYW5kIHN0cnVjdHVyZSBmb3IgY2hpcCBhbm9tYWxpdGllcworICogIDA1LTI1LTIwMDQgdGdseCAJYWRkZWQgYmFkIGJsb2NrIHRhYmxlIHN1cHBvcnQsIFNULU1JQ1JPIG1hbnVmYWN0dXJlciBpZAorICoJCQl1cGRhdGUgb2YgbmFuZF9jaGlwIHN0cnVjdHVyZSBkZXNjcmlwdGlvbgorICovCisjaWZuZGVmIF9fTElOVVhfTVREX05BTkRfSAorI2RlZmluZSBfX0xJTlVYX01URF9OQU5EX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKworc3RydWN0IG10ZF9pbmZvOworLyogU2NhbiBhbmQgaWRlbnRpZnkgYSBOQU5EIGRldmljZSAqLworZXh0ZXJuIGludCBuYW5kX3NjYW4gKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbWF4X2NoaXBzKTsKKy8qIEZyZWUgcmVzb3VyY2VzIGhlbGQgYnkgdGhlIE5BTkQgZGV2aWNlICovCitleHRlcm4gdm9pZCBuYW5kX3JlbGVhc2UgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKKworLyogUmVhZCByYXcgZGF0YSBmcm9tIHRoZSBkZXZpY2Ugd2l0aG91dCBFQ0MgKi8KK2V4dGVybiBpbnQgbmFuZF9yZWFkX3JhdyAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1ZiwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCBvb2JsZW4pOworCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBOQU5EIGNoaXBzIGluIGFuIGFycmF5ICovCisjZGVmaW5lIE5BTkRfTUFYX0NISVBTCQk4CisKKy8qIFRoaXMgY29uc3RhbnQgZGVjbGFyZXMgdGhlIG1heC4gb29ic2l6ZSAvIHBhZ2UsIHdoaWNoCisgKiBpcyBzdXBwb3J0ZWQgbm93LiBJZiB5b3UgYWRkIGEgY2hpcCB3aXRoIGJpZ2dlciBvb2JzaXplL3BhZ2UKKyAqIGFkanVzdCB0aGlzIGFjY29yZGluZ2x5LgorICovCisjZGVmaW5lIE5BTkRfTUFYX09PQlNJWkUJNjQKKworLyoKKyAqIENvbnN0YW50cyBmb3IgaGFyZHdhcmUgc3BlY2lmaWMgQ0xFL0FMRS9OQ0UgZnVuY3Rpb24KKyovCisvKiBTZWxlY3QgdGhlIGNoaXAgYnkgc2V0dGluZyBuQ0UgdG8gbG93ICovCisjZGVmaW5lIE5BTkRfQ1RMX1NFVE5DRSAJMQorLyogRGVzZWxlY3QgdGhlIGNoaXAgYnkgc2V0dGluZyBuQ0UgdG8gaGlnaCAqLworI2RlZmluZSBOQU5EX0NUTF9DTFJOQ0UJCTIKKy8qIFNlbGVjdCB0aGUgY29tbWFuZCBsYXRjaCBieSBzZXR0aW5nIENMRSB0byBoaWdoICovCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRQkJMworLyogRGVzZWxlY3QgdGhlIGNvbW1hbmQgbGF0Y2ggYnkgc2V0dGluZyBDTEUgdG8gbG93ICovCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRQkJNAorLyogU2VsZWN0IHRoZSBhZGRyZXNzIGxhdGNoIGJ5IHNldHRpbmcgQUxFIHRvIGhpZ2ggKi8KKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFCQk1CisvKiBEZXNlbGVjdCB0aGUgYWRkcmVzcyBsYXRjaCBieSBzZXR0aW5nIEFMRSB0byBsb3cgKi8KKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFCQk2CisvKiBTZXQgd3JpdGUgcHJvdGVjdGlvbiBieSBzZXR0aW5nIFdQIHRvIGhpZ2guIE5vdCB1c2VkISAqLworI2RlZmluZSBOQU5EX0NUTF9TRVRXUAkJNworLyogQ2xlYXIgd3JpdGUgcHJvdGVjdGlvbiBieSBzZXR0aW5nIFdQIHRvIGxvdy4gTm90IHVzZWQhICovCisjZGVmaW5lIE5BTkRfQ1RMX0NMUldQCQk4CisKKy8qCisgKiBTdGFuZGFyZCBOQU5EIGZsYXNoIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUgTkFORF9DTURfUkVBRDAJCTAKKyNkZWZpbmUgTkFORF9DTURfUkVBRDEJCTEKKyNkZWZpbmUgTkFORF9DTURfUEFHRVBST0cJMHgxMAorI2RlZmluZSBOQU5EX0NNRF9SRUFET09CCTB4NTAKKyNkZWZpbmUgTkFORF9DTURfRVJBU0UxCQkweDYwCisjZGVmaW5lIE5BTkRfQ01EX1NUQVRVUwkJMHg3MAorI2RlZmluZSBOQU5EX0NNRF9TVEFUVVNfTVVMVEkJMHg3MQorI2RlZmluZSBOQU5EX0NNRF9TRVFJTgkJMHg4MAorI2RlZmluZSBOQU5EX0NNRF9SRUFESUQJCTB4OTAKKyNkZWZpbmUgTkFORF9DTURfRVJBU0UyCQkweGQwCisjZGVmaW5lIE5BTkRfQ01EX1JFU0VUCQkweGZmCisKKy8qIEV4dGVuZGVkIGNvbW1hbmRzIGZvciBsYXJnZSBwYWdlIGRldmljZXMgKi8KKyNkZWZpbmUgTkFORF9DTURfUkVBRFNUQVJUCTB4MzAKKyNkZWZpbmUgTkFORF9DTURfQ0FDSEVEUFJPRwkweDE1CisKKy8qIFN0YXR1cyBiaXRzICovCisjZGVmaW5lIE5BTkRfU1RBVFVTX0ZBSUwJMHgwMQorI2RlZmluZSBOQU5EX1NUQVRVU19GQUlMX04xCTB4MDIKKyNkZWZpbmUgTkFORF9TVEFUVVNfVFJVRV9SRUFEWQkweDIwCisjZGVmaW5lIE5BTkRfU1RBVFVTX1JFQURZCTB4NDAKKyNkZWZpbmUgTkFORF9TVEFUVVNfV1AJCTB4ODAKKworLyogCisgKiBDb25zdGFudHMgZm9yIEVDQ19NT0RFUworICovCisKKy8qIE5vIEVDQy4gVXNhZ2UgaXMgbm90IHJlY29tbWVuZGVkICEgKi8KKyNkZWZpbmUgTkFORF9FQ0NfTk9ORQkJMAorLyogU29mdHdhcmUgRUNDIDMgYnl0ZSBFQ0MgcGVyIDI1NiBCeXRlIGRhdGEgKi8KKyNkZWZpbmUgTkFORF9FQ0NfU09GVAkJMQorLyogSGFyZHdhcmUgRUNDIDMgYnl0ZSBFQ0MgcGVyIDI1NiBCeXRlIGRhdGEgKi8KKyNkZWZpbmUgTkFORF9FQ0NfSFczXzI1NgkyCisvKiBIYXJkd2FyZSBFQ0MgMyBieXRlIEVDQyBwZXIgNTEyIEJ5dGUgZGF0YSAqLworI2RlZmluZSBOQU5EX0VDQ19IVzNfNTEyCTMKKy8qIEhhcmR3YXJlIEVDQyAzIGJ5dGUgRUNDIHBlciA1MTIgQnl0ZSBkYXRhICovCisjZGVmaW5lIE5BTkRfRUNDX0hXNl81MTIJNAorLyogSGFyZHdhcmUgRUNDIDggYnl0ZSBFQ0MgcGVyIDUxMiBCeXRlIGRhdGEgKi8KKyNkZWZpbmUgTkFORF9FQ0NfSFc4XzUxMgk2CisvKiBIYXJkd2FyZSBFQ0MgMTIgYnl0ZSBFQ0MgcGVyIDIwNDggQnl0ZSBkYXRhICovCisjZGVmaW5lIE5BTkRfRUNDX0hXMTJfMjA0OAk3CisKKy8qCisgKiBDb25zdGFudHMgZm9yIEhhcmR3YXJlIEVDQworKi8KKy8qIFJlc2V0IEhhcmR3YXJlIEVDQyBmb3IgcmVhZCAqLworI2RlZmluZSBOQU5EX0VDQ19SRUFECQkwCisvKiBSZXNldCBIYXJkd2FyZSBFQ0MgZm9yIHdyaXRlICovCisjZGVmaW5lIE5BTkRfRUNDX1dSSVRFCQkxCisvKiBFbmFibGUgSGFyZHdhcmUgRUNDIGJlZm9yZSBzeW5kcm9tIGlzIHJlYWQgYmFjayBmcm9tIGZsYXNoICovCisjZGVmaW5lIE5BTkRfRUNDX1JFQURTWU4JMgorCisvKiBPcHRpb24gY29uc3RhbnRzIGZvciBiaXphcnJlIGRpc2Z1bmN0aW9uYWxpdHkgYW5kIHJlYWwKKyogIGZlYXR1cmVzCisqLworLyogQ2hpcCBjYW4gbm90IGF1dG8gaW5jcmVtZW50IHBhZ2VzICovCisjZGVmaW5lIE5BTkRfTk9fQVVUT0lOQ1IJMHgwMDAwMDAwMQorLyogQnVzd2l0ZGggaXMgMTYgYml0ICovCisjZGVmaW5lIE5BTkRfQlVTV0lEVEhfMTYJMHgwMDAwMDAwMgorLyogRGV2aWNlIHN1cHBvcnRzIHBhcnRpYWwgcHJvZ3JhbW1pbmcgd2l0aG91dCBwYWRkaW5nICovCisjZGVmaW5lIE5BTkRfTk9fUEFERElORwkJMHgwMDAwMDAwNAorLyogQ2hpcCBoYXMgY2FjaGUgcHJvZ3JhbSBmdW5jdGlvbiAqLworI2RlZmluZSBOQU5EX0NBQ0hFUFJHCQkweDAwMDAwMDA4CisvKiBDaGlwIGhhcyBjb3B5IGJhY2sgZnVuY3Rpb24gKi8KKyNkZWZpbmUgTkFORF9DT1BZQkFDSwkJMHgwMDAwMDAxMAorLyogQU5EIENoaXAgd2hpY2ggaGFzIDQgYmFua3MgYW5kIGEgY29uZnVzaW5nIHBhZ2UgLyBibG9jayAKKyAqIGFzc2lnbm1lbnQuIFNlZSBSZW5lc2FzIGRhdGFzaGVldCBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBOQU5EX0lTX0FORAkJMHgwMDAwMDAyMAorLyogQ2hpcCBoYXMgYSBhcnJheSBvZiA0IHBhZ2VzIHdoaWNoIGNhbiBiZSByZWFkIHdpdGhvdXQKKyAqIGFkZGl0aW9uYWwgcmVhZHkgL2J1c3kgd2FpdHMgKi8KKyNkZWZpbmUgTkFORF80UEFHRV9BUlJBWQkweDAwMDAwMDQwIAorCisvKiBPcHRpb25zIHZhbGlkIGZvciBTYW1zdW5nIGxhcmdlIHBhZ2UgZGV2aWNlcyAqLworI2RlZmluZSBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUyBcCisJKE5BTkRfTk9fUEFERElORyB8IE5BTkRfQ0FDSEVQUkcgfCBOQU5EX0NPUFlCQUNLKQorCisvKiBNYWNyb3MgdG8gaWRlbnRpZnkgdGhlIGFib3ZlICovCisjZGVmaW5lIE5BTkRfQ0FOQVVUT0lOQ1IoY2hpcCkgKCEoY2hpcC0+b3B0aW9ucyAmIE5BTkRfTk9fQVVUT0lOQ1IpKQorI2RlZmluZSBOQU5EX01VU1RfUEFEKGNoaXApICghKGNoaXAtPm9wdGlvbnMgJiBOQU5EX05PX1BBRERJTkcpKQorI2RlZmluZSBOQU5EX0hBU19DQUNIRVBST0coY2hpcCkgKChjaGlwLT5vcHRpb25zICYgTkFORF9DQUNIRVBSRykpCisjZGVmaW5lIE5BTkRfSEFTX0NPUFlCQUNLKGNoaXApICgoY2hpcC0+b3B0aW9ucyAmIE5BTkRfQ09QWUJBQ0spKQorCisvKiBNYXNrIHRvIHplcm8gb3V0IHRoZSBjaGlwIG9wdGlvbnMsIHdoaWNoIGNvbWUgZnJvbSB0aGUgaWQgdGFibGUgKi8KKyNkZWZpbmUgTkFORF9DSElQT1BUSU9OU19NU0sJKDB4MDAwMGZmZmYgJiB+TkFORF9OT19BVVRPSU5DUikKKworLyogTm9uIGNoaXAgcmVsYXRlZCBvcHRpb25zICovCisvKiBVc2UgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGUuIFRoaXMgb3B0aW9uIGlzIHBhc3NlZCB0byB0aGUKKyAqIGRlZmF1bHQgYmFkIGJsb2NrIHRhYmxlIGZ1bmN0aW9uLiAqLworI2RlZmluZSBOQU5EX1VTRV9GTEFTSF9CQlQJMHgwMDAxMDAwMAorLyogVGhlIGh3IGVjYyBnZW5lcmF0b3IgcHJvdmlkZXMgYSBzeW5kcm9tZSBpbnN0ZWFkIGEgZWNjIHZhbHVlIG9uIHJlYWQgCisgKiBUaGlzIGNhbiBvbmx5IHdvcmsgaWYgd2UgaGF2ZSB0aGUgZWNjIGJ5dGVzIGRpcmVjdGx5IGJlaGluZCB0aGUgCisgKiBkYXRhIGJ5dGVzLiBBcHBsaWVzIGZvciBET0MgYW5kIEFHLUFORCBSZW5lc2FzIEhXIFJlZWQgU29sb21vbiBnZW5lcmF0b3JzICovCisjZGVmaW5lIE5BTkRfSFdFQ0NfU1lORFJPTUUJMHgwMDAyMDAwMAorCisKKy8qIE9wdGlvbnMgc2V0IGJ5IG5hbmQgc2NhbiAqLworLyogTmFuZCBzY2FuIGhhcyBhbGxvY2F0ZWQgb29iX2J1ZiAqLworI2RlZmluZSBOQU5EX09PQkJVRl9BTExPQwkweDQwMDAwMDAwCisvKiBOYW5kIHNjYW4gaGFzIGFsbG9jYXRlZCBkYXRhX2J1ZiAqLworI2RlZmluZSBOQU5EX0RBVEFCVUZfQUxMT0MJMHg4MDAwMDAwMAorCisKKy8qCisgKiBuYW5kX3N0YXRlX3QgLSBjaGlwIHN0YXRlcworICogRW51bWVyYXRpb24gZm9yIE5BTkQgZmxhc2ggY2hpcCBzdGF0ZQorICovCit0eXBlZGVmIGVudW0geworCUZMX1JFQURZLAorCUZMX1JFQURJTkcsCisJRkxfV1JJVElORywKKwlGTF9FUkFTSU5HLAorCUZMX1NZTkNJTkcsCisJRkxfQ0FDSEVEUFJHLAorfSBuYW5kX3N0YXRlX3Q7CisKKy8qIEtlZXAgZ2NjIGhhcHB5ICovCitzdHJ1Y3QgbmFuZF9jaGlwOworCisvKioKKyAqIHN0cnVjdCBuYW5kX2h3X2NvbnRyb2wgLSBDb250cm9sIHN0cnVjdHVyZSBmb3IgaGFyZHdhcmUgY29udHJvbGxlciAoZS5nIEVDQyBnZW5lcmF0b3IpIHNoYXJlZCBhbW9uZyBpbmRlcGVuZGVuZCBkZXZpY2VzCisgKiBAbG9jazogICAgICAgICAgICAgICBwcm90ZWN0aW9uIGxvY2sgIAorICogQGFjdGl2ZToJCXRoZSBtdGQgZGV2aWNlIHdoaWNoIGhvbGRzIHRoZSBjb250cm9sbGVyIGN1cnJlbnRseQorICovCitzdHJ1Y3QgbmFuZF9od19jb250cm9sIHsKKwlzcGlubG9ja190CSBsb2NrOworCXN0cnVjdCBuYW5kX2NoaXAgKmFjdGl2ZTsKK307CisKKy8qKgorICogc3RydWN0IG5hbmRfY2hpcCAtIE5BTkQgUHJpdmF0ZSBGbGFzaCBDaGlwIERhdGEKKyAqIEBJT19BRERSX1I6CQlbQk9BUkRTUEVDSUZJQ10gYWRkcmVzcyB0byByZWFkIHRoZSA4IEkvTyBsaW5lcyBvZiB0aGUgZmxhc2ggZGV2aWNlIAorICogQElPX0FERFJfVzoJCVtCT0FSRFNQRUNJRklDXSBhZGRyZXNzIHRvIHdyaXRlIHRoZSA4IEkvTyBsaW5lcyBvZiB0aGUgZmxhc2ggZGV2aWNlIAorICogQHJlYWRfYnl0ZToJCVtSRVBMQUNFQUJMRV0gcmVhZCBvbmUgYnl0ZSBmcm9tIHRoZSBjaGlwCisgKiBAd3JpdGVfYnl0ZToJCVtSRVBMQUNFQUJMRV0gd3JpdGUgb25lIGJ5dGUgdG8gdGhlIGNoaXAKKyAqIEByZWFkX3dvcmQ6CQlbUkVQTEFDRUFCTEVdIHJlYWQgb25lIHdvcmQgZnJvbSB0aGUgY2hpcAorICogQHdyaXRlX3dvcmQ6CQlbUkVQTEFDRUFCTEVdIHdyaXRlIG9uZSB3b3JkIHRvIHRoZSBjaGlwCisgKiBAd3JpdGVfYnVmOgkJW1JFUExBQ0VBQkxFXSB3cml0ZSBkYXRhIGZyb20gdGhlIGJ1ZmZlciB0byB0aGUgY2hpcAorICogQHJlYWRfYnVmOgkJW1JFUExBQ0VBQkxFXSByZWFkIGRhdGEgZnJvbSB0aGUgY2hpcCBpbnRvIHRoZSBidWZmZXIKKyAqIEB2ZXJpZnlfYnVmOgkJW1JFUExBQ0VBQkxFXSB2ZXJpZnkgYnVmZmVyIGNvbnRlbnRzIGFnYWluc3QgdGhlIGNoaXAgZGF0YQorICogQHNlbGVjdF9jaGlwOglbUkVQTEFDRUFCTEVdIHNlbGVjdCBjaGlwIG5yCisgKiBAYmxvY2tfYmFkOgkJW1JFUExBQ0VBQkxFXSBjaGVjaywgaWYgdGhlIGJsb2NrIGlzIGJhZAorICogQGJsb2NrX21hcmtiYWQ6CVtSRVBMQUNFQUJMRV0gbWFyayB0aGUgYmxvY2sgYmFkCisgKiBAaHdjb250cm9sOgkJW0JPQVJEU1BFQ0lGSUNdIGhhcmR3YXJlc3BlY2lmaWMgZnVuY3Rpb24gZm9yIGFjY2VzaW5nIGNvbnRyb2wtbGluZXMKKyAqIEBkZXZfcmVhZHk6CQlbQk9BUkRTUEVDSUZJQ10gaGFyZHdhcmVzcGVjaWZpYyBmdW5jdGlvbiBmb3IgYWNjZXNpbmcgZGV2aWNlIHJlYWR5L2J1c3kgbGluZQorICoJCQlJZiBzZXQgdG8gTlVMTCBubyBhY2Nlc3MgdG8gcmVhZHkvYnVzeSBpcyBhdmFpbGFibGUgYW5kIHRoZSByZWFkeS9idXN5IGluZm9ybWF0aW9uCisgKgkJCWlzIHJlYWQgZnJvbSB0aGUgY2hpcCBzdGF0dXMgcmVnaXN0ZXIKKyAqIEBjbWRmdW5jOgkJW1JFUExBQ0VBQkxFXSBoYXJkd2FyZXNwZWNpZmljIGZ1bmN0aW9uIGZvciB3cml0aW5nIGNvbW1hbmRzIHRvIHRoZSBjaGlwCisgKiBAd2FpdGZ1bmM6CQlbUkVQTEFDRUFCTEVdIGhhcmR3YXJlc3BlY2lmaWMgZnVuY3Rpb24gZm9yIHdhaXQgb24gcmVhZHkKKyAqIEBjYWxjdWxhdGVfZWNjOiAJW1JFUExBQ0VBQkxFXSBmdW5jdGlvbiBmb3IgZWNjIGNhbGN1bGF0aW9uIG9yIHJlYWRiYWNrIGZyb20gZWNjIGhhcmR3YXJlCisgKiBAY29ycmVjdF9kYXRhOglbUkVQTEFDRUFCTEVdIGZ1bmN0aW9uIGZvciBlY2MgY29ycmVjdGlvbiwgbWF0Y2hpbmcgdG8gZWNjIGdlbmVyYXRvciAoc3cvaHcpCisgKiBAZW5hYmxlX2h3ZWNjOglbQk9BUkRTUEVDSUZJQ10gZnVuY3Rpb24gdG8gZW5hYmxlIChyZXNldCkgaGFyZHdhcmUgZWNjIGdlbmVyYXRvci4gTXVzdCBvbmx5CisgKgkJCWJlIHByb3ZpZGVkIGlmIGEgaGFyZHdhcmUgRUNDIGlzIGF2YWlsYWJsZQorICogQGVyYXNlX2NtZDoJCVtJTlRFUk5dIGVyYXNlIGNvbW1hbmQgd3JpdGUgZnVuY3Rpb24sIHNlbGVjdGFibGUgZHVlIHRvIEFORCBzdXBwb3J0CisgKiBAc2Nhbl9iYnQ6CQlbUkVQTEFDRUFCTEVdIGZ1bmN0aW9uIHRvIHNjYW4gYmFkIGJsb2NrIHRhYmxlCisgKiBAZWNjbW9kZToJCVtCT0FSRFNQRUNJRklDXSBtb2RlIG9mIGVjYywgc2VlIGRlZmluZXMgCisgKiBAZWNjc2l6ZTogCQlbSU5URVJOXSBkYXRhYnl0ZXMgdXNlZCBwZXIgZWNjLWNhbGN1bGF0aW9uCisgKiBAZWNjYnl0ZXM6IAkJW0lOVEVSTl0gbnVtYmVyIG9mIGVjYyBieXRlcyBwZXIgZWNjLWNhbGN1bGF0aW9uIHN0ZXAKKyAqIEBlY2NzdGVwczoJCVtJTlRFUk5dIG51bWJlciBvZiBlY2MgY2FsY3VsYXRpb24gc3RlcHMgcGVyIHBhZ2UKKyAqIEBjaGlwX2RlbGF5OgkJW0JPQVJEU1BFQ0lGSUNdIGNoaXAgZGVwZW5kZW50IGRlbGF5IGZvciB0cmFuc2ZlcmluZyBkYXRhIGZyb20gYXJyYXkgdG8gcmVhZCByZWdzICh0UikKKyAqIEBjaGlwX2xvY2s6CQlbSU5URVJOXSBzcGlubG9jayB1c2VkIHRvIHByb3RlY3QgYWNjZXNzIHRvIHRoaXMgc3RydWN0dXJlIGFuZCB0aGUgY2hpcAorICogQHdxOgkJCVtJTlRFUk5dIHdhaXQgcXVldWUgdG8gc2xlZXAgb24gaWYgYSBOQU5EIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcworICogQHN0YXRlOiAJCVtJTlRFUk5dIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBOQU5EIGRldmljZQorICogQHBhZ2Vfc2hpZnQ6CQlbSU5URVJOXSBudW1iZXIgb2YgYWRkcmVzcyBiaXRzIGluIGEgcGFnZSAoY29sdW1uIGFkZHJlc3MgYml0cykKKyAqIEBwaHlzX2VyYXNlX3NoaWZ0OglbSU5URVJOXSBudW1iZXIgb2YgYWRkcmVzcyBiaXRzIGluIGEgcGh5c2ljYWwgZXJhc2VibG9jaworICogQGJidF9lcmFzZV9zaGlmdDoJW0lOVEVSTl0gbnVtYmVyIG9mIGFkZHJlc3MgYml0cyBpbiBhIGJidCBlbnRyeQorICogQGNoaXBfc2hpZnQ6CQlbSU5URVJOXSBudW1iZXIgb2YgYWRkcmVzcyBiaXRzIGluIG9uZSBjaGlwCisgKiBAZGF0YV9idWY6CQlbSU5URVJOXSBpbnRlcm5hbCBidWZmZXIgZm9yIG9uZSBwYWdlICsgb29iIAorICogQG9vYl9idWY6CQlbSU5URVJOXSBvb2IgYnVmZmVyIGZvciBvbmUgZXJhc2VibG9jaworICogQG9vYmRpcnR5OgkJW0lOVEVSTl0gaW5kaWNhdGVzIHRoYXQgb29iX2J1ZiBtdXN0IGJlIHJlaW5pdGlhbGl6ZWQKKyAqIEBkYXRhX3BvaToJCVtJTlRFUk5dIHBvaW50ZXIgdG8gYSBkYXRhIGJ1ZmZlcgorICogQG9wdGlvbnM6CQlbQk9BUkRTUEVDSUZJQ10gdmFyaW91cyBjaGlwIG9wdGlvbnMuIFRoZXkgY2FuIHBhcnRseSBiZSBzZXQgdG8gaW5mb3JtIG5hbmRfc2NhbiBhYm91dAorICoJCQlzcGVjaWFsIGZ1bmN0aW9uYWxpdHkuIFNlZSB0aGUgZGVmaW5lcyBmb3IgZnVydGhlciBleHBsYW5hdGlvbgorICogQGJhZGJsb2NrcG9zOglbSU5URVJOXSBwb3NpdGlvbiBvZiB0aGUgYmFkIGJsb2NrIG1hcmtlciBpbiB0aGUgb29iIGFyZWEKKyAqIEBudW1jaGlwczoJCVtJTlRFUk5dIG51bWJlciBvZiBwaHlzaWNhbCBjaGlwcworICogQGNoaXBzaXplOgkJW0lOVEVSTl0gdGhlIHNpemUgb2Ygb25lIGNoaXAgZm9yIG11bHRpY2hpcCBhcnJheXMKKyAqIEBwYWdlbWFzazoJCVtJTlRFUk5dIHBhZ2UgbnVtYmVyIG1hc2sgPSBudW1iZXIgb2YgKHBhZ2VzIC8gY2hpcCkgLSAxCisgKiBAcGFnZWJ1ZjoJCVtJTlRFUk5dIGhvbGRzIHRoZSBwYWdlbnVtYmVyIHdoaWNoIGlzIGN1cnJlbnRseSBpbiBkYXRhX2J1ZgorICogQGF1dG9vb2I6CQlbUkVQTEFDRUFCTEVdIHRoZSBkZWZhdWx0IChhdXRvKXBsYWNlbWVudCBzY2hlbWUKKyAqIEBiYnQ6CQlbSU5URVJOXSBiYWQgYmxvY2sgdGFibGUgcG9pbnRlcgorICogQGJidF90ZDoJCVtSRVBMQUNFQUJMRV0gYmFkIGJsb2NrIHRhYmxlIGRlc2NyaXB0b3IgZm9yIGZsYXNoIGxvb2t1cAorICogQGJidF9tZDoJCVtSRVBMQUNFQUJMRV0gYmFkIGJsb2NrIHRhYmxlIG1pcnJvciBkZXNjcmlwdG9yCisgKiBAYmFkYmxvY2tfcGF0dGVybjoJW1JFUExBQ0VBQkxFXSBiYWQgYmxvY2sgc2NhbiBwYXR0ZXJuIHVzZWQgZm9yIGluaXRpYWwgYmFkIGJsb2NrIHNjYW4gCisgKiBAY29udHJvbGxlcjoJCVtPUFRJT05BTF0gYSBwb2ludGVyIHRvIGEgaGFyZHdhcmUgY29udHJvbGxlciBzdHJ1Y3R1cmUgd2hpY2ggaXMgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluZGVwZW5kZW5kIGRldmljZXMKKyAqIEBwcml2OgkJW09QVElPTkFMXSBwb2ludGVyIHRvIHByaXZhdGUgY2hpcCBkYXRlCisgKi8KKyAKK3N0cnVjdCBuYW5kX2NoaXAgeworCXZvaWQgIF9faW9tZW0JKklPX0FERFJfUjsKKwl2b2lkICBfX2lvbWVtIAkqSU9fQUREUl9XOworCQorCXVfY2hhcgkJKCpyZWFkX2J5dGUpKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKKwl2b2lkCQkoKndyaXRlX2J5dGUpKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgYnl0ZSk7CisJdTE2CQkoKnJlYWRfd29yZCkoc3RydWN0IG10ZF9pbmZvICptdGQpOworCXZvaWQJCSgqd3JpdGVfd29yZCkoc3RydWN0IG10ZF9pbmZvICptdGQsIHUxNiB3b3JkKTsKKwkKKwl2b2lkCQkoKndyaXRlX2J1Zikoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgbGVuKTsKKwl2b2lkCQkoKnJlYWRfYnVmKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICpidWYsIGludCBsZW4pOworCWludAkJKCp2ZXJpZnlfYnVmKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pOworCXZvaWQJCSgqc2VsZWN0X2NoaXApKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY2hpcCk7CisJaW50CQkoKmJsb2NrX2JhZCkoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIGludCBnZXRjaGlwKTsKKwlpbnQJCSgqYmxvY2tfbWFya2JhZCkoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMpOworCXZvaWQgCQkoKmh3Y29udHJvbCkoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQpOworCWludCAgCQkoKmRldl9yZWFkeSkoc3RydWN0IG10ZF9pbmZvICptdGQpOworCXZvaWQgCQkoKmNtZGZ1bmMpKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1bnNpZ25lZCBjb21tYW5kLCBpbnQgY29sdW1uLCBpbnQgcGFnZV9hZGRyKTsKKwlpbnQgCQkoKndhaXRmdW5jKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqdGhpcywgaW50IHN0YXRlKTsKKwlpbnQJCSgqY2FsY3VsYXRlX2VjYykoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKTsKKwlpbnQgCQkoKmNvcnJlY3RfZGF0YSkoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqZGF0LCB1X2NoYXIgKnJlYWRfZWNjLCB1X2NoYXIgKmNhbGNfZWNjKTsKKwl2b2lkCQkoKmVuYWJsZV9od2VjYykoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtb2RlKTsKKwl2b2lkCQkoKmVyYXNlX2NtZCkoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBwYWdlKTsKKwlpbnQJCSgqc2Nhbl9iYnQpKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKKwlpbnQJCWVjY21vZGU7CisJaW50CQllY2NzaXplOworCWludAkJZWNjYnl0ZXM7CisJaW50CQllY2NzdGVwczsKKwlpbnQgCQljaGlwX2RlbGF5OworCXNwaW5sb2NrX3QJY2hpcF9sb2NrOworCXdhaXRfcXVldWVfaGVhZF90IHdxOworCW5hbmRfc3RhdGVfdCAJc3RhdGU7CisJaW50IAkJcGFnZV9zaGlmdDsKKwlpbnQJCXBoeXNfZXJhc2Vfc2hpZnQ7CisJaW50CQliYnRfZXJhc2Vfc2hpZnQ7CisJaW50CQljaGlwX3NoaWZ0OworCXVfY2hhciAJCSpkYXRhX2J1ZjsKKwl1X2NoYXIJCSpvb2JfYnVmOworCWludAkJb29iZGlydHk7CisJdV9jaGFyCQkqZGF0YV9wb2k7CisJdW5zaWduZWQgaW50CW9wdGlvbnM7CisJaW50CQliYWRibG9ja3BvczsKKwlpbnQJCW51bWNoaXBzOworCXVuc2lnbmVkIGxvbmcJY2hpcHNpemU7CisJaW50CQlwYWdlbWFzazsKKwlpbnQJCXBhZ2VidWY7CisJc3RydWN0IG5hbmRfb29iaW5mbwkqYXV0b29vYjsKKwl1aW50OF90CQkqYmJ0OworCXN0cnVjdCBuYW5kX2JidF9kZXNjcgkqYmJ0X3RkOworCXN0cnVjdCBuYW5kX2JidF9kZXNjcgkqYmJ0X21kOworCXN0cnVjdCBuYW5kX2JidF9kZXNjcgkqYmFkYmxvY2tfcGF0dGVybjsKKwlzdHJ1Y3QgbmFuZF9od19jb250cm9sICAqY29udHJvbGxlcjsKKwl2b2lkCQkqcHJpdjsKK307CisKKy8qCisgKiBOQU5EIEZsYXNoIE1hbnVmYWN0dXJlciBJRCBDb2RlcworICovCisjZGVmaW5lIE5BTkRfTUZSX1RPU0hJQkEJMHg5OAorI2RlZmluZSBOQU5EX01GUl9TQU1TVU5HCTB4ZWMKKyNkZWZpbmUgTkFORF9NRlJfRlVKSVRTVQkweDA0CisjZGVmaW5lIE5BTkRfTUZSX05BVElPTkFMCTB4OGYKKyNkZWZpbmUgTkFORF9NRlJfUkVORVNBUwkweDA3CisjZGVmaW5lIE5BTkRfTUZSX1NUTUlDUk8JMHgyMAorCisvKioKKyAqIHN0cnVjdCBuYW5kX2ZsYXNoX2RldiAtIE5BTkQgRmxhc2ggRGV2aWNlIElEIFN0cnVjdHVyZQorICoKKyAqIEBuYW1lOiAgCUlkZW50aWZ5IHRoZSBkZXZpY2UgdHlwZQorICogQGlkOiAgIAlkZXZpY2UgSUQgY29kZQorICogQHBhZ2VzaXplOiAgCVBhZ2VzaXplIGluIGJ5dGVzLiBFaXRoZXIgMjU2IG9yIDUxMiBvciAwCisgKgkJSWYgdGhlIHBhZ2VzaXplIGlzIDAsIHRoZW4gdGhlIHJlYWwgcGFnZXNpemUgCisgKgkJYW5kIHRoZSBlcmFzZWl6ZSBhcmUgZGV0ZXJtaW5lZCBmcm9tIHRoZQorICoJCWV4dGVuZGVkIGlkIGJ5dGVzIGluIHRoZSBjaGlwCisgKiBAZXJhc2VzaXplOiAJU2l6ZSBvZiBhbiBlcmFzZSBibG9jayBpbiB0aGUgZmxhc2ggZGV2aWNlLgorICogQGNoaXBzaXplOiAgCVRvdGFsIGNoaXBzaXplIGluIE1lZ2EgQnl0ZXMKKyAqIEBvcHRpb25zOglCaXRmaWVsZCB0byBzdG9yZSBjaGlwIHJlbGV2YW50IG9wdGlvbnMKKyAqLworc3RydWN0IG5hbmRfZmxhc2hfZGV2IHsKKwljaGFyICpuYW1lOworCWludCBpZDsKKwl1bnNpZ25lZCBsb25nIHBhZ2VzaXplOworCXVuc2lnbmVkIGxvbmcgY2hpcHNpemU7CisJdW5zaWduZWQgbG9uZyBlcmFzZXNpemU7CisJdW5zaWduZWQgbG9uZyBvcHRpb25zOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbmFuZF9tYW51ZmFjdHVyZXJzIC0gTkFORCBGbGFzaCBNYW51ZmFjdHVyZXIgSUQgU3RydWN0dXJlCisgKiBAbmFtZToJTWFudWZhY3R1cmVyIG5hbWUKKyAqIEBpZDogCW1hbnVmYWN0dXJlciBJRCBjb2RlIG9mIGRldmljZS4KKyovCitzdHJ1Y3QgbmFuZF9tYW51ZmFjdHVyZXJzIHsKKwlpbnQgaWQ7CisJY2hhciAqIG5hbWU7Cit9OworCitleHRlcm4gc3RydWN0IG5hbmRfZmxhc2hfZGV2IG5hbmRfZmxhc2hfaWRzW107CitleHRlcm4gc3RydWN0IG5hbmRfbWFudWZhY3R1cmVycyBuYW5kX21hbnVmX2lkc1tdOworCisvKiogCisgKiBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgLSBiYWQgYmxvY2sgdGFibGUgZGVzY3JpcHRvcgorICogQG9wdGlvbnM6CW9wdGlvbnMgZm9yIHRoaXMgZGVzY3JpcHRvcgorICogQHBhZ2VzOgl0aGUgcGFnZShzKSB3aGVyZSB3ZSBmaW5kIHRoZSBiYnQsIHVzZWQgd2l0aCBvcHRpb24gQkJUX0FCU1BBR0UKKyAqCQl3aGVuIGJidCBpcyBzZWFyY2hlZCwgdGhlbiB3ZSBzdG9yZSB0aGUgZm91bmQgYmJ0cyBwYWdlcyBoZXJlLgorICoJCUl0cyBhbiBhcnJheSBhbmQgc3VwcG9ydHMgdXAgdG8gOCBjaGlwcyBub3cKKyAqIEBvZmZzOglvZmZzZXQgb2YgdGhlIHBhdHRlcm4gaW4gdGhlIG9vYiBhcmVhIG9mIHRoZSBwYWdlCisgKiBAdmVyb2ZmczoJb2Zmc2V0IG9mIHRoZSBiYnQgdmVyc2lvbiBjb3VudGVyIGluIHRoZSBvb2IgYXJlIG9mIHRoZSBwYWdlCisgKiBAdmVyc2lvbjoJdmVyc2lvbiByZWFkIGZyb20gdGhlIGJidCBwYWdlIGR1cmluZyBzY2FuCisgKiBAbGVuOglsZW5ndGggb2YgdGhlIHBhdHRlcm4sIGlmIDAgbm8gcGF0dGVybiBjaGVjayBpcyBwZXJmb3JtZWQKKyAqIEBtYXhibG9ja3M6CW1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyB0byBzZWFyY2ggZm9yIGEgYmJ0LiBUaGlzIG51bWJlciBvZgorICoJCWJsb2NrcyBpcyByZXNlcnZlZCBhdCB0aGUgZW5kIG9mIHRoZSBkZXZpY2Ugd2hlcmUgdGhlIHRhYmxlcyBhcmUgCisgKgkJd3JpdHRlbi4KKyAqIEByZXNlcnZlZF9ibG9ja19jb2RlOiBpZiBub24tMCwgdGhpcyBwYXR0ZXJuIGRlbm90ZXMgYSByZXNlcnZlZCAocmF0aGVyIHRoYW4KKyAqICAgICAgICAgICAgICBiYWQpIGJsb2NrIGluIHRoZSBzdG9yZWQgYmJ0CisgKiBAcGF0dGVybjoJcGF0dGVybiB0byBpZGVudGlmeSBiYWQgYmxvY2sgdGFibGUgb3IgZmFjdG9yeSBtYXJrZWQgZ29vZCAvIAorICoJCWJhZCBibG9ja3MsIGNhbiBiZSBOVUxMLCBpZiBsZW4gPSAwCisgKgorICogRGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZSBtYXJrZXIgYW5kIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgCisgKiBwYXR0ZXJuIHdoaWNoIGlkZW50aWZpZXMgZ29vZCBhbmQgYmFkIGJsb2Nrcy4gVGhlIGFzc3VtcHRpb24gaXMgbWFkZQorICogdGhhdCB0aGUgcGF0dGVybiBhbmQgdGhlIHZlcnNpb24gY291bnQgYXJlIGFsd2F5cyBsb2NhdGVkIGluIHRoZSBvb2IgYXJlYQorICogb2YgdGhlIGZpcnN0IGJsb2NrLgorICovCitzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgeworCWludAlvcHRpb25zOworCWludAlwYWdlc1tOQU5EX01BWF9DSElQU107CisJaW50CW9mZnM7CisJaW50CXZlcm9mZnM7CisJdWludDhfdAl2ZXJzaW9uW05BTkRfTUFYX0NISVBTXTsKKwlpbnQJbGVuOworCWludCAJbWF4YmxvY2tzOworCWludAlyZXNlcnZlZF9ibG9ja19jb2RlOworCXVpbnQ4X3QJKnBhdHRlcm47Cit9OworCisvKiBPcHRpb25zIGZvciB0aGUgYmFkIGJsb2NrIHRhYmxlIGRlc2NyaXB0b3JzICovCisKKy8qIFRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHBlciBibG9jayBpbiB0aGUgYmJ0IG9uIHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUgTkFORF9CQlRfTlJCSVRTX01TSwkweDAwMDAwMDBGCisjZGVmaW5lIE5BTkRfQkJUXzFCSVQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTkFORF9CQlRfMkJJVAkJMHgwMDAwMDAwMgorI2RlZmluZSBOQU5EX0JCVF80QklUCQkweDAwMDAwMDA0CisjZGVmaW5lIE5BTkRfQkJUXzhCSVQJCTB4MDAwMDAwMDgKKy8qIFRoZSBiYWQgYmxvY2sgdGFibGUgaXMgaW4gdGhlIGxhc3QgZ29vZCBibG9jayBvZiB0aGUgZGV2aWNlICovCisjZGVmaW5lCU5BTkRfQkJUX0xBU1RCTE9DSwkweDAwMDAwMDEwCisvKiBUaGUgYmJ0IGlzIGF0IHRoZSBnaXZlbiBwYWdlLCBlbHNlIHdlIG11c3Qgc2NhbiBmb3IgdGhlIGJidCAqLworI2RlZmluZSBOQU5EX0JCVF9BQlNQQUdFCTB4MDAwMDAwMjAKKy8qIFRoZSBiYnQgaXMgYXQgdGhlIGdpdmVuIHBhZ2UsIGVsc2Ugd2UgbXVzdCBzY2FuIGZvciB0aGUgYmJ0ICovCisjZGVmaW5lIE5BTkRfQkJUX1NFQVJDSAkJMHgwMDAwMDA0MAorLyogYmJ0IGlzIHN0b3JlZCBwZXIgY2hpcCBvbiBtdWx0aWNoaXAgZGV2aWNlcyAqLworI2RlZmluZSBOQU5EX0JCVF9QRVJDSElQCTB4MDAwMDAwODAKKy8qIGJidCBoYXMgYSB2ZXJzaW9uIGNvdW50ZXIgYXQgb2Zmc2V0IHZlcm9mZnMgKi8KKyNkZWZpbmUgTkFORF9CQlRfVkVSU0lPTgkweDAwMDAwMTAwCisvKiBDcmVhdGUgYSBiYnQgaWYgbm9uZSBheGlzdHMgKi8KKyNkZWZpbmUgTkFORF9CQlRfQ1JFQVRFCQkweDAwMDAwMjAwCisvKiBTZWFyY2ggZ29vZCAvIGJhZCBwYXR0ZXJuIHRocm91Z2ggYWxsIHBhZ2VzIG9mIGEgYmxvY2sgKi8KKyNkZWZpbmUgTkFORF9CQlRfU0NBTkFMTFBBR0VTCTB4MDAwMDA0MDAKKy8qIFNjYW4gYmxvY2sgZW1wdHkgZHVyaW5nIGdvb2QgLyBiYWQgYmxvY2sgc2NhbiAqLworI2RlZmluZSBOQU5EX0JCVF9TQ0FORU1QVFkJMHgwMDAwMDgwMAorLyogV3JpdGUgYmJ0IGlmIG5lY2NlY2FyeSAqLworI2RlZmluZSBOQU5EX0JCVF9XUklURQkJMHgwMDAwMTAwMAorLyogUmVhZCBhbmQgd3JpdGUgYmFjayBibG9jayBjb250ZW50cyB3aGVuIHdyaXRpbmcgYmJ0ICovCisjZGVmaW5lIE5BTkRfQkJUX1NBVkVDT05URU5UCTB4MDAwMDIwMDAKKy8qIFNlYXJjaCBnb29kIC8gYmFkIHBhdHRlcm4gb24gdGhlIGZpcnN0IGFuZCB0aGUgc2Vjb25kIHBhZ2UgKi8KKyNkZWZpbmUgTkFORF9CQlRfU0NBTjJORFBBR0UJMHgwMDAwNDAwMAorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIHRvIHNjYW4gZm9yIGEgYmJ0ICovCisjZGVmaW5lIE5BTkRfQkJUX1NDQU5fTUFYQkxPQ0tTCTQKKworZXh0ZXJuIGludCBuYW5kX3NjYW5fYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiZCk7CitleHRlcm4gaW50IG5hbmRfdXBkYXRlX2JidCAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZmZzKTsKK2V4dGVybiBpbnQgbmFuZF9kZWZhdWx0X2JidCAoc3RydWN0IG10ZF9pbmZvICptdGQpOworZXh0ZXJuIGludCBuYW5kX2lzYmFkX2JidCAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZmZzLCBpbnQgYWxsb3diYnQpOworZXh0ZXJuIGludCBuYW5kX2VyYXNlX25hbmQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIsIGludCBhbGxvd2JidCk7CisKKy8qCisqIENvbnN0YW50cyBmb3Igb29iIGNvbmZpZ3VyYXRpb24KKyovCisjZGVmaW5lIE5BTkRfU01BTExfQkFEQkxPQ0tfUE9TCQk1CisjZGVmaW5lIE5BTkRfTEFSR0VfQkFEQkxPQ0tfUE9TCQkwCisKKyNlbmRpZiAvKiBfX0xJTlVYX01URF9OQU5EX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL25hbmRfZWNjLmggYi9pbmNsdWRlL2xpbnV4L210ZC9uYW5kX2VjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYzViYzMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9uYW5kX2VjYy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiAgZHJpdmVycy9tdGQvbmFuZF9lY2MuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgU3RldmVuIEouIEhpbGwgKHNqaGlsbEByZWFsaXR5ZGlsdXRlZC5jb20pCisgKgorICogJElkOiBuYW5kX2VjYy5oLHYgMS40IDIwMDQvMDYvMTcgMDI6MzU6MDIgZGJyb3duIEV4cCAkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgdGhlIGhlYWRlciBmb3IgdGhlIEVDQyBhbGdvcml0aG0uCisgKi8KKworI2lmbmRlZiBfX01URF9OQU5EX0VDQ19IX18KKyNkZWZpbmUgX19NVERfTkFORF9FQ0NfSF9fCisKK3N0cnVjdCBtdGRfaW5mbzsKKworLyoKKyAqIENhbGN1bGF0ZSAzIGJ5dGUgRUNDIGNvZGUgZm9yIDI1NiBieXRlIGJsb2NrCisgKi8KK2ludCBuYW5kX2NhbGN1bGF0ZV9lY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKTsKKworLyoKKyAqIERldGVjdCBhbmQgY29ycmVjdCBhIDEgYml0IGVycm9yIGZvciAyNTYgYnl0ZSBibG9jaworICovCitpbnQgbmFuZF9jb3JyZWN0X2RhdGEoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqZGF0LCB1X2NoYXIgKnJlYWRfZWNjLCB1X2NoYXIgKmNhbGNfZWNjKTsKKworI2VuZGlmIC8qIF9fTVREX05BTkRfRUNDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvbmZ0bC5oIGIvaW5jbHVkZS9saW51eC9tdGQvbmZ0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNWQyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9uZnRsLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqICRJZDogbmZ0bC5oLHYgMS4xNiAyMDA0LzA2LzMwIDE0OjQ5OjAwIGRicm93biBFeHAgJAorICoKKyAqIChDKSAxOTk5LTIwMDMgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICovCisKKyNpZm5kZWYgX19NVERfTkZUTF9IX18KKyNkZWZpbmUgX19NVERfTkZUTF9IX18KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvYmxrdHJhbnMuaD4KKworI2luY2x1ZGUgPG10ZC9uZnRsLXVzZXIuaD4KKworLyogdGhlc2UgaW5mbyBhcmUgdXNlZCBpbiBSZXBsVW5pdFRhYmxlICovCisjZGVmaW5lIEJMT0NLX05JTCAgICAgICAgICAweGZmZmYgLyogbGFzdCBibG9jayBvZiBhIGNoYWluICovCisjZGVmaW5lIEJMT0NLX0ZSRUUgICAgICAgICAweGZmZmUgLyogZnJlZSBibG9jayAqLworI2RlZmluZSBCTE9DS19OT1RFWFBMT1JFRCAgMHhmZmZkIC8qIG5vbiBleHBsb3JlZCBibG9jaywgb25seSB1c2VkIGR1cmluZyBtb3VudGluZyAqLworI2RlZmluZSBCTE9DS19SRVNFUlZFRCAgICAgMHhmZmZjIC8qIGJpb3MgYmxvY2sgb3IgYmFkIGJsb2NrICovCisKK3N0cnVjdCBORlRMcmVjb3JkIHsKKwlzdHJ1Y3QgbXRkX2Jsa3RyYW5zX2RldiBtYmQ7CisJX191MTYgTWVkaWFVbml0LCBTcGFyZU1lZGlhVW5pdDsKKwlfX3UzMiBFcmFzZVNpemU7CisJc3RydWN0IE5GVExNZWRpYUhlYWRlciBNZWRpYUhkcjsKKwlpbnQgdXNlY291bnQ7CisJdW5zaWduZWQgY2hhciBoZWFkczsKKwl1bnNpZ25lZCBjaGFyIHNlY3RvcnM7CisJdW5zaWduZWQgc2hvcnQgY3lsaW5kZXJzOworCV9fdTE2IG51bXZ1bml0czsKKwlfX3UxNiBsYXN0RVVOOyAgICAgICAgICAgICAgICAgIC8qIHNob3VsZCBiZSBzdXBwcmVzc2VkICovCisJX191MTYgbnVtZnJlZUVVTnM7CisJX191MTYgTGFzdEZyZWVFVU47IAkJLyogVG8gc3BlZWQgdXAgZmluZGluZyBhIGZyZWUgRVVOICovCisJaW50IGhlYWQsc2VjdCxjeWw7CisJX191MTYgKkVVTnRhYmxlOyAJCS8qIFtudW12dW5pdHNdOiBGaXJzdCBFVU4gZm9yIGVhY2ggdmlydHVhbCB1bml0ICAqLworCV9fdTE2ICpSZXBsVW5pdFRhYmxlOyAJCS8qIFtudW1FVU5zXTogUmVwbFVuaXROdW1iZXIgZm9yIGVhY2ggKi8KKyAgICAgICAgdW5zaWduZWQgaW50IG5iX2Jsb2NrczsJCS8qIG51bWJlciBvZiBwaHlzaWNhbCBibG9ja3MgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IG5iX2Jvb3RfYmxvY2tzOwkvKiBudW1iZXIgb2YgYmxvY2tzIHVzZWQgYnkgdGhlIGJpb3MgKi8KKyAgICAgICAgc3RydWN0IGVyYXNlX2luZm8gaW5zdHI7CisJc3RydWN0IG5hbmRfb29iaW5mbyBvb2JpbmZvOworfTsKKworaW50IE5GVExfbW91bnQoc3RydWN0IE5GVExyZWNvcmQgKnMpOworaW50IE5GVExfZm9ybWF0YmxvY2soc3RydWN0IE5GVExyZWNvcmQgKnMsIGludCBibG9jayk7CisKKyNpZm5kZWYgTkZUTF9NQUpPUgorI2RlZmluZSBORlRMX01BSk9SIDkzCisjZW5kaWYKKworI2RlZmluZSBNQVhfTkZUTFMgMTYKKyNkZWZpbmUgTUFYX1NFQ1RPUlNfUEVSX1VOSVQgNjQKKyNkZWZpbmUgTkZUTF9QQVJUTl9CSVRTIDQKKworI2VuZGlmIC8qIF9fTVREX05GVExfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9wYXJ0aXRpb25zLmggYi9pbmNsdWRlL2xpbnV4L210ZC9wYXJ0aXRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiMmVkZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL3BhcnRpdGlvbnMuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogTVREIHBhcnRpdGlvbmluZyBsYXllciBkZWZpbml0aW9ucworICoKKyAqIChDKSAyMDAwIE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4KKyAqCisgKiBUaGlzIGNvZGUgaXMgR1BMCisgKgorICogJElkOiBwYXJ0aXRpb25zLmgsdiAxLjE2IDIwMDQvMTEvMTYgMTg6MzQ6NDAgZHdtdzIgRXhwICQKKyAqLworCisjaWZuZGVmIE1URF9QQVJUSVRJT05TX0gKKyNkZWZpbmUgTVREX1BBUlRJVElPTlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisvKgorICogUGFydGl0aW9uIGRlZmluaXRpb24gc3RydWN0dXJlOgorICogCisgKiBBbiBhcnJheSBvZiBzdHJ1Y3QgcGFydGl0aW9uIGlzIHBhc3NlZCBhbG9uZyB3aXRoIGEgTVREIG9iamVjdCB0bworICogYWRkX210ZF9wYXJ0aXRpb25zKCkgdG8gY3JlYXRlIHRoZW0uCisgKgorICogRm9yIGVhY2ggcGFydGl0aW9uLCB0aGVzZSBmaWVsZHMgYXJlIGF2YWlsYWJsZToKKyAqIG5hbWU6IHN0cmluZyB0aGF0IHdpbGwgYmUgdXNlZCB0byBsYWJlbCB0aGUgcGFydGl0aW9uJ3MgTVREIGRldmljZS4KKyAqIHNpemU6IHRoZSBwYXJ0aXRpb24gc2l6ZTsgaWYgZGVmaW5lZCBhcyBNVERQQVJUX1NJWl9GVUxMLCB0aGUgcGFydGl0aW9uIAorICogCXdpbGwgZXh0ZW5kIHRvIHRoZSBlbmQgb2YgdGhlIG1hc3RlciBNVEQgZGV2aWNlLgorICogb2Zmc2V0OiBhYnNvbHV0ZSBzdGFydGluZyBwb3NpdGlvbiB3aXRoaW4gdGhlIG1hc3RlciBNVEQgZGV2aWNlOyBpZiAKKyAqIAlkZWZpbmVkIGFzIE1URFBBUlRfT0ZTX0FQUEVORCwgdGhlIHBhcnRpdGlvbiB3aWxsIHN0YXJ0IHdoZXJlIHRoZSAKKyAqIAlwcmV2aW91cyBvbmUgZW5kZWQ7IGlmIE1URFBBUlRfT0ZTX05YVEJMSywgYXQgdGhlIG5leHQgZXJhc2UgYmxvY2suCisgKiBtYXNrX2ZsYWdzOiBjb250YWlucyBmbGFncyB0aGF0IGhhdmUgdG8gYmUgbWFza2VkIChyZW1vdmVkKSBmcm9tIHRoZSAKKyAqIAltYXN0ZXIgTVREIGZsYWcgc2V0IGZvciB0aGUgY29ycmVzcG9uZGluZyBNVEQgcGFydGl0aW9uLgorICogCUZvciBleGFtcGxlLCB0byBmb3JjZSBhIHJlYWQtb25seSBwYXJ0aXRpb24sIHNpbXBseSBhZGRpbmcgCisgKiAJTVREX1dSSVRFQUJMRSB0byB0aGUgbWFza19mbGFncyB3aWxsIGRvIHRoZSB0cmljay4KKyAqCisgKiBOb3RlOiB3cml0ZWFibGUgcGFydGl0aW9ucyByZXF1aXJlIHRoZWlyIHNpemUgYW5kIG9mZnNldCBiZSAKKyAqIGVyYXNlc2l6ZSBhbGlnbmVkIChlLmcuIHVzZSBNVERQQVJUX09GU19ORVhUQkxLKS4KKyAqLyAKKworc3RydWN0IG10ZF9wYXJ0aXRpb24geworCWNoYXIgKm5hbWU7CQkJLyogaWRlbnRpZmllciBzdHJpbmcgKi8KKwl1X2ludDMyX3Qgc2l6ZTsJCQkvKiBwYXJ0aXRpb24gc2l6ZSAqLworCXVfaW50MzJfdCBvZmZzZXQ7CQkvKiBvZmZzZXQgd2l0aGluIHRoZSBtYXN0ZXIgTVREIHNwYWNlICovCisJdV9pbnQzMl90IG1hc2tfZmxhZ3M7CQkvKiBtYXN0ZXIgTVREIGZsYWdzIHRvIG1hc2sgb3V0IGZvciB0aGlzIHBhcnRpdGlvbiAqLworCXN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbDsJLyogb3V0IG9mIGJhbmQgbGF5b3V0IGZvciB0aGlzIHBhcnRpdGlvbiAoTkFORCBvbmx5KSovCisJc3RydWN0IG10ZF9pbmZvICoqbXRkcDsJCS8qIHBvaW50ZXIgdG8gc3RvcmUgdGhlIE1URCBvYmplY3QgKi8KK307CisKKyNkZWZpbmUgTVREUEFSVF9PRlNfTlhUQkxLCSgtMikKKyNkZWZpbmUgTVREUEFSVF9PRlNfQVBQRU5ECSgtMSkKKyNkZWZpbmUgTVREUEFSVF9TSVpfRlVMTAkoMCkKKworCitpbnQgYWRkX210ZF9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqLCBjb25zdCBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqLCBpbnQpOworaW50IGRlbF9tdGRfcGFydGl0aW9ucyhzdHJ1Y3QgbXRkX2luZm8gKik7CisKKy8qCisgKiBGdW5jdGlvbnMgZGVhbGluZyB3aXRoIHRoZSB2YXJpb3VzIHdheXMgb2YgcGFydGl0aW9uaW5nIHRoZSBzcGFjZQorICovCisKK3N0cnVjdCBtdGRfcGFydF9wYXJzZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKnBhcnNlX2ZuKShzdHJ1Y3QgbXRkX2luZm8gKiwgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiosIHVuc2lnbmVkIGxvbmcpOworfTsKKworZXh0ZXJuIGludCByZWdpc3Rlcl9tdGRfcGFyc2VyKHN0cnVjdCBtdGRfcGFydF9wYXJzZXIgKnBhcnNlcik7CitleHRlcm4gaW50IGRlcmVnaXN0ZXJfbXRkX3BhcnNlcihzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyICpwYXJzZXIpOworZXh0ZXJuIGludCBwYXJzZV9tdGRfcGFydGl0aW9ucyhzdHJ1Y3QgbXRkX2luZm8gKm1hc3RlciwgY29uc3QgY2hhciAqKnR5cGVzLCAKKwkJCQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cywgdW5zaWduZWQgbG9uZyBvcmlnaW4pOworCisjZGVmaW5lIHB1dF9wYXJ0aXRpb25fcGFyc2VyKHApIGRvIHsgbW9kdWxlX3B1dCgocCktPm93bmVyKTsgfSB3aGlsZSgwKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvcGh5c21hcC5oIGIvaW5jbHVkZS9saW51eC9tdGQvcGh5c21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YWE0OTcwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvcGh5c21hcC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBGb3IgYm9hcmRzIHdpdGggcGh5c2ljYWxseSBtYXBwZWQgZmxhc2ggYW5kIHVzaW5nIAorICogZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMgbWFwcGluZyBkcml2ZXIuCisgKgorICogJElkOiBwaHlzbWFwLmgsdiAxLjMgMjAwNC8wNy8yMSAwMDoxNjoxNSBqd2JveWVyIEV4cCAkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBKdW4gU3VuLCBqc3VuQG12aXN0YS5jb20gb3IganN1bkBqdW5zdW4ubmV0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01URF9QSFlTTUFQX18KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIAorCisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisvKgorICogVGhlIG1hcF9pbmZvIGZvciBwaHlzbWFwLiAgQm9hcmQgY2FuIG92ZXJyaWRlIHNpemUsIGJ1c3dpZHRoLCBwaHlzLAorICogKCpzZXRfdnBwKSgpLCBldGMgaW4gdGhlaXIgaW5pdGlhbCBzZXR1cCByb3V0aW5lLgorICovCitleHRlcm4gc3RydWN0IG1hcF9pbmZvIHBoeXNtYXBfbWFwOworCisvKgorICogQm9hcmQgbmVlZHMgdG8gc3BlY2lmeSB0aGUgZXhhY3QgbWFwcGluZyBkdXJpbmcgdGhlaXIgc2V0dXAgdGltZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHBoeXNtYXBfY29uZmlndXJlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgYmFua3dpZHRoLCB2b2lkICgqc2V0X3ZwcCkoc3RydWN0IG1hcF9pbmZvICosIGludCkgKQoreworCXBoeXNtYXBfbWFwLnBoeXMgPSBhZGRyOworCXBoeXNtYXBfbWFwLnNpemUgPSBzaXplOworCXBoeXNtYXBfbWFwLmJhbmt3aWR0aCA9IGJhbmt3aWR0aDsKKwlwaHlzbWFwX21hcC5zZXRfdnBwID0gc2V0X3ZwcDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX01URF9QQVJUSVRJT05TKQorCisvKgorICogTWFjaGluZXMgdGhhdCB3aXNoIHRvIGRvIGZsYXNoIHBhcnRpdGlvbiBtYXkgd2FudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gaW4gCisgKiB0aGVpciBzZXR1cCByb3V0aW5lLiAgCisgKgorICoJcGh5c21hcF9zZXRfcGFydGl0aW9ucyhteXBhcnRpdGlvbnMsIG51bV9wYXJ0cyk7CisgKgorICogTm90ZSB0aGF0IG9uZSBjYW4gYWx3YXlzIG92ZXJyaWRlIHRoaXMgaGFyZC1jb2RlZCBwYXJ0aXRpb24gd2l0aCAKKyAqIGNvbW1hbmQgbGluZSBwYXJ0aXRpb24gKHlvdSBuZWVkIHRvIGVuYWJsZSBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMpLgorICovCit2b2lkIHBoeXNtYXBfc2V0X3BhcnRpdGlvbnMoc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzLCBpbnQgbnVtX3BhcnRzKTsKKworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX01URF9QQVJUSVRJT05TKSAqLworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX01URCkgKi8KKworI2VuZGlmIC8qIF9fTElOVVhfTVREX1BIWVNNQVBfXyAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9wbWM1NTEuaCBiL2luY2x1ZGUvbGludXgvbXRkL3BtYzU1MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExM2UzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9wbWM1NTEuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogJElkOiBwbWM1NTEuaCx2IDEuNSAyMDAzLzAxLzI0IDE2OjQ5OjUzIGR3bXcyIEV4cCAkCisgKgorICogUE1DNTUxIFBDSSBNZXp6YW5pbmUgUmFtIERldmljZQorICoKKyAqIEF1dGhvcjoKKyAqICAgICAgIE1hcmsgRmVycmVsbAorICogICAgICAgQ29weXJpZ2h0IDE5OTksMjAwMCBOb3J0ZWwgTmV0d29ya3MKKyAqCisgKiBMaWNlbnNlOiAKKyAqCSBBcyBwYXJ0IG9mIHRoaXMgZHJpdmVyIHdhcyBkZXJyaXZlZCBmcm9tIHRoZSBzbHJhbS5jIGRyaXZlciBpdCBmYWxscworICoJIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UsIHdoaWNoIGlzIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyCisgKi8KKworI2lmbmRlZiBfX01URF9QTUM1NTFfSF9fCisjZGVmaW5lIF9fTVREX1BNQzU1MV9IX18KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKworI2RlZmluZSBQTUM1NTFfVkVSU0lPTiAiJElkOiBwbWM1NTEuaCx2IDEuNSAyMDAzLzAxLzI0IDE2OjQ5OjUzIGR3bXcyIEV4cCAkXG4iXAorICAgICAgICJSYW1peCBQTUM1NTEgUENJIE1lenphbmluZSBSYW0gRHJpdmVyLiAoQykgMTk5OSwyMDAwIE5vcnRlbCBOZXR3b3Jrcy5cbiIKKworLyoKKyAqIE91ciBwZXJzb25hbCBhbmQgcHJpdmF0ZSBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgbXlwcml2IHsKKyAgICAgICAgc3RydWN0IHBjaV9kZXYgKmRldjsKKyAgICAgICAgdV9jaGFyICpzdGFydDsKKyAgICAgICAgdTMyICAgIGJhc2VfbWFwMDsKKyAgICAgICAgdTMyICAgIGN1cnJfbWFwMDsKKyAgICAgICAgdTMyICAgIGFzaXplOworCXN0cnVjdCBtdGRfaW5mbyAqbmV4dHBtYzU1MTsKK307ICAgICAgICAgICAgICAgICAgICAgICAKKworLyoKKyAqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqLworc3RhdGljIGludCBwbWM1NTFfZXJhc2Uoc3RydWN0IG10ZF9pbmZvICosIHN0cnVjdCBlcmFzZV9pbmZvICopOworc3RhdGljIHZvaWQgcG1jNTUxX3VucG9pbnQoc3RydWN0IG10ZF9pbmZvICosIHVfY2hhciAqLCBsb2ZmX3QsIHNpemVfdCk7CitzdGF0aWMgaW50IHBtYzU1MV9wb2ludCAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICoqbXRkYnVmKTsKK3N0YXRpYyBpbnQgcG1jNTUxX3JlYWQoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgdV9jaGFyICopOworc3RhdGljIGludCBwbWM1NTFfd3JpdGUoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgY29uc3QgdV9jaGFyICopOyAgICAgICAgCisKKworLyoKKyAqIERlZmluZSB0aGUgUENJIElEJ3MgaWYgdGhlIGtlcm5lbCBkb2Vzbid0IGRlZmluZSB0aGVtIGZvciB1cworICovCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfVjNfU0VNSQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1YzX1NFTUkgICAgICAgICAgICAgMHgxMWIwCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1YzX1NFTUlfVjM3MFBEQworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1YzX1NFTUlfVjM3MFBEQyAgICAgMHgwMjAwICAKKyNlbmRpZgorCisKKyNkZWZpbmUgUE1DNTUxX1BDSV9NRU1fTUFQMAkweDUwCisjZGVmaW5lIFBNQzU1MV9QQ0lfTUVNX01BUDEJMHg1NAorI2RlZmluZSBQTUM1NTFfUENJX01FTV9NQVBfTUFQX0FERFJfTUFTSwkweDNmZjAwMDAwCisjZGVmaW5lIFBNQzU1MV9QQ0lfTUVNX01BUF9BUEVSVFVSRV9NQVNLCTB4MDAwMDAwZjAKKyNkZWZpbmUgUE1DNTUxX1BDSV9NRU1fTUFQX1JFR19FTgkJMHgwMDAwMDAwMgorI2RlZmluZSBQTUM1NTFfUENJX01FTV9NQVBfRU5BQkxFCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgUE1DNTUxX1NEUkFNX01BCQkweDYwCisjZGVmaW5lIFBNQzU1MV9TRFJBTV9DTUQJMHg2MgorI2RlZmluZSBQTUM1NTFfRFJBTV9DRkcJCTB4NjQKKyNkZWZpbmUgUE1DNTUxX1NZU19DVFJMX1JFRwkweDc4CisKKyNkZWZpbmUgUE1DNTUxX0RSQU1fQkxLMAkweDY4CisjZGVmaW5lIFBNQzU1MV9EUkFNX0JMSzEJMHg2YworI2RlZmluZSBQTUM1NTFfRFJBTV9CTEsyCTB4NzAKKyNkZWZpbmUgUE1DNTUxX0RSQU1fQkxLMwkweDc0CisjZGVmaW5lIFBNQzU1MV9EUkFNX0JMS19HRVRfU0laRSh4KSAoNTI0Mjg4PDwoKHg+PjQpJjB4MGYpKQorI2RlZmluZSBQTUM1NTFfRFJBTV9CTEtfU0VUX0NPTF9NVVgoeCx2KSAoKCh4KSAmIH4weDAwMDA3MDAwKSB8ICgoKHYpICYgMHg3KSA8PCAxMikpCisjZGVmaW5lIFBNQzU1MV9EUkFNX0JMS19TRVRfUk9XX01VWCh4LHYpICgoKHgpICYgfjB4MDAwMDBmMDApIHwgKCgodikgJiAweGYpIDw8IDgpKQorCisKKyNlbmRpZiAvKiBfX01URF9QTUM1NTFfSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3hpcC5oIGIvaW5jbHVkZS9saW51eC9tdGQveGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwNzExMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL3hpcC5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTVREIHByaW1pdGl2ZXMgZm9yIFhJUCBzdXBwb3J0CisgKgorICogQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiBDcmVhdGVkOglOb3YgMiwgMjAwNAorICogQ29weXJpZ2h0OgkoQykgMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogVGhpcyBYSVAgc3VwcG9ydCBmb3IgTVREIGhhcyBiZWVuIGxvb3NlbHkgaW5zcGlyZWQKKyAqIGJ5IGFuIGVhcmxpZXIgcGF0Y2ggYXV0aG9yZWQgYnkgRGF2aWQgV29vZGhvdXNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogJElkOiB4aXAuaCx2IDEuMiAyMDA0LzEyLzAxIDE1OjQ5OjEwIG5pY28gRXhwICQKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTVREX1hJUF9IX18KKyNkZWZpbmUgX19MSU5VWF9NVERfWElQX0hfXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfTVREX1hJUAorCisvKgorICogRnVuY3Rpb24gdGhhdCBhcmUgbW9kaWZ5aW5nIHRoZSBmbGFzaCBzdGF0ZSBhd2F5IGZyb20gYXJyYXkgbW9kZSBtdXN0CisgKiBvYnZpb3VzbHkgbm90IGJlIHJ1bm5pbmcgZnJvbSBmbGFzaC4gIFRoZSBfX3hpcHJhbSBpcyB0aGVyZWZvcmUgbWFya2luZworICogdGhvc2UgZnVuY3Rpb25zIHNvIHRoZXkgZ2V0IHJlbG9jYXRlZCB0byByYW0uCisgKi8KKyNkZWZpbmUgX194aXByYW0gX19hdHRyaWJ1dGVfXyAoKF9fc2VjdGlvbl9fICgiLmRhdGEiKSkpCisKKy8qCisgKiBXZSByZWFsbHkgZG9uJ3Qgd2FudCBnY2MgdG8gZ3Vlc3MgYW55dGhpbmcuCisgKiBXZSBhYnNvbHV0ZWx5IF9uZWVkXyBwcm9wZXIgaW5saW5pbmcuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisvKgorICogRWFjaCBhcmNoaXRlY3R1cmUgaGFzIHRvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBtYWNyb3MuICBUaGV5IG11c3QgYWNjZXNzCisgKiB0aGUgaGFyZHdhcmUgZGlyZWN0bHkgYW5kIG5vdCByZWx5IG9uIGFueSBvdGhlciAoWElQKSBmdW5jdGlvbnMgc2luY2UgdGhleQorICogd29uJ3QgYmUgYXZhaWxhYmxlIHdoZW4gdXNlZCAoZmxhc2ggbm90IGluIGFycmF5IG1vZGUpLgorICoKKyAqIHhpcF9pcnFwZW5kaW5nKCkKKyAqCisgKiAJcmV0dXJuIG5vbiB6ZXJvIHdoZW4gYW55IGhhcmR3YXJlIGludGVycnVwdCBpcyBwZW5kaW5nLgorICoKKyAqIHhpcF9jdXJydGltZSgpCisgKgorICogCXJldHVybiBhIHBsYXRmb3JtIHNwZWNpZmljIHRpbWUgcmVmZXJlbmNlIHRvIGJlIHVzZWQgd2l0aAorICogCXhpcF9lbGFwc2VkX3NpbmNlKCkuCisgKgorICogeGlwX2VsYXBzZWRfc2luY2UoeCkKKyAqCisgKiAJcmV0dXJuIGluIHVzZWNzIHRoZSBlbGFwc2VkIHRpbWViZXR3ZWVuIG5vdyBhbmQgdGhlIHJlZmVyZW5jZSB4IGFzCisgKiAJcmV0dXJuZWQgYnkgeGlwX2N1cnJ0aW1lKCkuCisgKgorICogCW5vdGUgMTogY29udmVydGlvbiB0byB1c2VjIGNhbiBiZSBhcHByb3hpbWF0ZWQsIGFzIGxvbmcgYXMgdGhlCisgKiAJCXJldHVybmVkIHZhbHVlIGlzIDw9IHRoZSByZWFsIGVsYXBzZWQgdGltZS4KKyAqIAlub3RlIDI6IHRoaXMgc2hvdWxkIGJlIGFibGUgdG8gY29wZSB3aXRoIGEgZmV3IHNlY29uZHMgd2l0aG91dAorICogCQlvdmVyZmxvd2luZy4KKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9TQTExMDApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfUFhBKQorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaWZkZWYgQ09ORklHX0FSQ0hfUFhBCisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNlbmRpZgorCisjZGVmaW5lIHhpcF9pcnFwZW5kaW5nKCkJKElDSVAgJiBJQ01SKQorCisvKiB3ZSBzYW1wbGUgT1NDUiBhbmQgY29udmVydCBkZXNpcmVkIGRlbHRhIHRvIHVzZWMgKDEvNCB+PSAxMDAwMDAwLzM2ODY0MDApICovCisjZGVmaW5lIHhpcF9jdXJydGltZSgpCQkoT1NDUikKKyNkZWZpbmUgeGlwX2VsYXBzZWRfc2luY2UoeCkJKHNpZ25lZCkoKE9TQ1IgLSAoeCkpIC8gNCkKKworI2Vsc2UKKworI3dhcm5pbmcgIm1pc3NpbmcgSVJRIGFuZCB0aW1lciBwcmltaXRpdmVzIGZvciBYSVAgTVREIHN1cHBvcnQiCisjd2FybmluZyAic29tZSBvZiB0aGUgWElQIE1URCBzdXBwb3J0IGNvZGUgd2lsbCBiZSBkaXNhYmxlZCIKKyN3YXJuaW5nICJ5b3VyIHN5c3RlbSB3aWxsIHRoZXJlZm9yZSBiZSB1bnJlc3BvbnNpdmUgd2hlbiB3cml0aW5nIG9yIGVyYXNpbmcgZmxhc2giCisKKyNkZWZpbmUgeGlwX2lycXBlbmRpbmcoKQkoMCkKKyNkZWZpbmUgeGlwX2N1cnJ0aW1lKCkJCSgwKQorI2RlZmluZSB4aXBfZWxhcHNlZF9zaW5jZSh4KQkoMCkKKworI2VuZGlmCisKKy8qCisgKiB4aXBfY3B1X2lkbGUoKSBpcyB1c2VkIHdoZW4gd2FpdGluZyBmb3IgYSBkZWxheSBlcXVhbCBvciBsYXJnZXIgdGhhbgorICogdGhlIHN5c3RlbSB0aW1lciB0aWNrIHBlcmlvZC4gIFRoaXMgc2hvdWxkIHB1dCB0aGUgQ1BVIGludG8gaWRsZSBtb2RlCisgKiB0byBzYXZlIHBvd2VyIGFuZCB0byBiZSB3b2tlbiB1cCBvbmx5IHdoZW4gc29tZSBpbnRlcnJ1cHRzIGFyZSBwZW5kaW5nLgorICogQXMgYWJvdmUsIHRoaXMgc2hvdWxkIG5vdCByZWx5IHVwb24gc3RhbmRhcmQga2VybmVsIGNvZGUuCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9YU0NBTEUpCisjZGVmaW5lIHhpcF9jcHVfaWRsZSgpICBhc20gdm9sYXRpbGUgKCJtY3IgcDE0LCAwLCAlMCwgYzcsIGMwLCAwIiA6OiAiciIgKDEpKQorI2Vsc2UKKyNkZWZpbmUgeGlwX2NwdV9pZGxlKCkgIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZWxzZQorCisjZGVmaW5lIF9feGlwcmFtCisKKyNlbmRpZiAvKiBDT05GSUdfTVREX1hJUCAqLworCisjZW5kaWYgLyogX19MSU5VWF9NVERfWElQX0hfXyAqLwo=